介绍

我们可以每一维数组里面的每个关键正常值= >打印顺序,但如果它是一个多维数组需要循环嵌套的循环或递归,但这些方法不灵活,因为数组中的不确定性是几维的情况下,如果递归嵌套循环不可能永无止境。来解决,但如果你只想使用foreach循环如何实现

实施模式1

PHP本身的迭代器recursiveiteratoriterator




test_arr美元=阵列(1,2,3,阵列(4,AA= > 5,6,阵列(7,'BB' = > 8),9、10、11、12));
arrayiter =新recursivearrayiterator美元(美元test_arr);
iteriter =新recursiveiteratoriterator美元(美元arrayiter);
您可以直接打印打印/水平序列。
foreach(美元美元美元关键= val iteriter){
$;
}
结果
*
0 = 1
1 = 2
2 = 3
0 = 4
5
2 = 6
0 = 7
BB = 8
4 = 9
5 = 10
4 = 11
5 = 12
* /


实施模式

迭代器类recursiveiteratoriterator实现多维数组的横向打印的实现




类foreachprintfarr实现迭代器{
当前数组范围
私人_items美元;
私人_old_items美元;
每个执行环境堆栈数组
私人_stack美元=阵();

公共功能__construct($data =阵列()){
美元-> _items = $数据;
}

私有函数_isset(){
价值=当前美元(美元-> _items);

如果(空(美元-> _stack)!$ $ {){
返回false;
{人}
返回true;
}
}

公共函数当前(){
美元-> _old_items = null;
价值=当前美元(美元-> _items);

如果数组保存当前的执行环境,然后切换到新的数组执行环境
如果(is_array($ Val)){
array_push(美元-> _stack,美元-> _items);
美元-> _items = $ Val;
返回$当前();
}

在完成当前执行之后,判断是否要删除最后的执行环境
如果存在(1)继续执行
(2)如果它不存在,堆栈是空的,则将当前执行表示为最后一个元素。
/ /(3)如果有一个元素的环境下没有当前数组,然后保存当前执行环境_old_items =美元->美元-> _items阵列;
最后的执行环境,然后切换 / /美元-> _items = array_pop(美元-> _stack)继续循环,直到下一次的阵列
到目前为止,元素不是空的。
当(1){
如果(下(美元-> _items)){
沪指(美元-> _items);突破;
} elseif(空(美元-> _stack)){
结束(美元-> _items);突破;
{人}
结束(美元-> _items);
如果(!美元-> _old_items)
这_old_items =美元->美元-> _items;
美元-> _items = array_pop(美元-> _stack);
}
}

返回$ $;
}

公共函数下一步(){
二(美元-> _items);
}

公共函数键(){
当前()函数中的键()函数
因此,在当前()函数中切换执行环境,将导致在最后一个键的执行环境之前进行切换。
在切换到关键/美元-> _old_items,这样节省了执行环境切换之前
防止键打印错误
返回这个-> _old_items关键(美元-> _old_items):关键(美元-> _items);
}

公共函数倒带(){
复位(美元-> _items);
}

公共函数有效(){
返回这个-> _isset();
}
}




内部执行



1、foreachprintfarr foreach循环我们的自定义类,会自动调用内部方法5有效的(),(),()键倒带,下(),电流(),我们只需要实现这些方法。

2。调用顺序:

第一个>

第二个


test_arr美元=阵列(1,2,3,阵列(4,AA= > 5,6,阵列(7,'BB' = > 8),9、10、11、12));
iteriter =新foreachprintfarr美元(美元test_arr);
foreach(美元美元美元关键= val iteriter){
$;
}
结果:
*
0 = 1
1 = 2
2 = 3
0 = 4
5
2 = 6
0 = 7
BB = 8
4 = 9
5 = 10
4 = 11
5 = 12
* /




以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。