介紹
正常我們的foreach可以按順序把一維陣列裡面每個 key => value 列印出來,但是如果是多維陣列則需要迴圈在巢狀迴圈,或則遞迴實現,但是這些方式都不夠靈活,因為在不確定該陣列是幾維的情況下,不可能永無止境的巢狀迴圈,如果採用遞迴到可以解決,但是如果只想使用foreach全部迴圈出來該如何實現?
實現方式 一
採用php本身自帶的迭代器類 recursiveiteratoriterator
$test_arr = array(1,2,3,array(4,'aa'=>5,6,array(7,'bb'=>8),9,10),11,12);
$arrayiter = new recursivearrayiterator($test_arr);
$iteriter = new recursiveiteratoriterator($arrayiter);
//直接列印即可按照橫向順序列印出來
foreach ($iteriter as $key => $val)
//結果
/* www.cppcns.com 0=>1
1=>2
2=>3
0=>4
aa=>5
2=>6
0=>7
bb=>8
4=>9
5=>10
4=>11
5=>12
*/實現方式 二
自己實現乙個類似於 recursiveiteratoriterator 的迭代器類,實現多維陣列橫向列印功能
class foreachprintfarr implements iterator
private function _isset() else
}public function current()
//判斷當前執行完成後是否需要切回上次執行環境
//(1) 如果存在跳出繼續執行
//(2) 如果不存在且環境棧為空,則表示當前執行到最後乙個元素
//(3) 如果當前陣列環境下乙個元素不存在,則儲存一下當前執行陣列環境 $this->_old_items = $this->_items;
//然後切換上次執行環境 $this->_items = array_pop($this->_stack) 繼續迴圈, 直到當前陣列環境下乙個
//元素不為空為止
while (1) elseif (empty($this->_stack)) else
www.cppcns.com }
return $val;
}public function next()
public function key()
public function rewind()
public function valid()
}內部執行方式
1、foreach 迴圈我們自定義的foreachprintfarr類,會自動呼叫內部這5個方法 valid()、rewind()、key()、next()、current() 我們xdwezcamf只需要實現這幾個方法即可.
2、呼叫順序:
第1次 => 程式設計客棧rewind -> valid -> current -> key
第2次~n次 => next -> valid -> current -> key
$test_arr = array(1,2,3,array(4,'aa'=>5,6,array(7,'bb'=>8),9,10),11,12);
$iteriter = new foreachprintfarr($test_arr);
foreach ($iteriter as $key => $val)
//結果:
/* 0=>1
1=>2
2=>3
0=>4
aa=>5
2=>6
0=>7
bb=>8
4=>9
5=>10
4=>11
5=>12
*/本文標題: php foreach遍歷多維陣列實現方式
本文位址:
遍歷多維列表中指定的數的索引
當時寫的時候,發現網上沒有類似的,知乎上有人問,卻沒有答案。那就自己動手吧 這種情況是3維的,但是有沒有可能實現多維?def find where list 3,target for t in range len list 3 for tr in range len list 3 t for td ...
python遍歷多維序列搜尋 棧
def listfiand w,obj li w k1 bate 外字典,記錄所有的元素 li2 str li h2 li2.find s obj 用字串搜尋obj的位置 print h2 h2 print h3 li2.count 0,h2 print h4 li2.count 0,h2 h 1 ...
如何遍歷維數和各維上限未定的多維陣列
這個題目,不方便使用遞迴!直覺告訴我,可以用兩層遍歷,外面一層是維數,裡面一層是每一維。但實際上,要做起來很難!最後決定最外層迴圈用元素個數,裡面配合使用維數的迴圈,最終解決問題!static void arrenum array arr,action func 設定為最底層 rank arr.ra...