foreach遍歷多維數組實現
介紹
正常我們的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){
echo $key.' => '.$val.'<br/>';
}
//結果
/*
0 => 1
1 => 2
2 => 3
0 => 4
aa => 5
1 => 6
0 => 7
bb => 8
3 => 9
4 => 10
4 => 11
5 => 12
*/
實現方式 二
自己實現一個類似于 RecursiveIteratorIterator 的迭代器類,實現多維數組橫向打印功能
class foreachPrintArr implements Iterator
{
//當前數組作用域
private $_items;
//保存每次執行數組環境棧
private $_stack = array();
public function __construct($data = array())
{
$this->_items = $data;
}
private function _isset()
{
return current($this->_items) ? true : false;
}
public function current()
{
$val = current($this->_items);
//如果是數組則保存當前執行環境, 然后切換到新的數組執行環境
if (is_array($val)) {
array_push($this->_stack, $this->_items);
$this->_items = $val;
return $this->current();
}
return $val;
}
public function next()
{
//當前數組執行環境執行到最后,并且還存在上次未執行完的環境,則切換回來
if (!next($this->_items) && !empty($this->_stack)) {
$this->_items = array_pop($this->_stack);
$this->next();
}
}
public function key()
{
return key($this->_items);
}
public function rewind()
{
reset($this->_items);
}
public function valid()
{
return $this->_isset();
}
}
內部執行方式
foreach 循環我們自定義的
foreachPrintfArr
類,會自動調用內部這5個方法valid()
、rewind()
、key()
、next()
、current()
我們只需要實現這幾個方法即可.調用順序:
第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 foreachPrintArr($test_arr);
foreach ($iteriter as $key => $val){
echo $key.' => '.$val.'<br/>';
}
//結果:
/*
0 => 1
1 => 2
2 => 3
0 => 4
aa => 5
1 => 6
0 => 7
bb => 8
3 => 9
4 => 10
4 => 11
5 => 12
*/