PHP foreach遍歷多維陣列實現方式

2022-10-06 08:48:10 字數 2033 閱讀 3551

介紹

正常我們的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...