我试图用PHP的工厂类编写一个自定义数组迭代器。我的问题:我需要所有数组的所有数据,例如,这是一个简单的PHP数组:
Array
(
[authentication] => Array
(
[basic] => Array
(
[username] => guest
[password] => guest
)
[filters] => Array
(
[price] => 100
[owener] => me
)
)
)
我在PHP的doc页面上看到,我可以使用两个简单的类并使用简单的foreach进行迭代:
$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($this->phpArray));
foreach($iterator as $key => $value) {
$d = $iterator->getDepth();
echo "depth: $d $key => $value\n";
}
此程序抛出以下输出:
depth: 2 key: username, value: guest
depth: 2 key: password, value: guest
depth: 2 key: price, value: 100
depth: 2 key: owener, value: me
如何修改我的代码,可以使用所有数据执行以下示例输出:
depth: 0 key: authentication, value:
depth: 1 key: basic, value:
depth: 1 key: filters,
depth: 2 key: username, value: guest
depth: 2 key: password, value: guest
depth: 2 key: price, value: 100
depth: 2 key: owener, value: me
谢谢!
答案 0 :(得分:3)
使用RecursiveIteratorIterator
时,您可以设置不同的遍历模式。默认值为RecursiveIteratorIterator::LEAVES_ONLY
。这就是为什么你只得到叶子,但不是所有的值(顺便说一句array_walk_recursive
具有相同的行为)。要访问所有元素,您需要将模式设置为RecursiveIteratorIterator::SELF_FIRST
:
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($array),
\RecursiveIteratorIterator::SELF_FIRST
);
这是working demo。
答案 1 :(得分:1)
或者,您可以使用这样的递归函数:
function traverseArray($arr, &$depthArray, $depth = 0){
foreach($arr as $key => $value){
if(is_array($value)){
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => '');
traverseArray($value, $depthArray, ++$depth);
--$depth;
}else{
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => $value);
}
}
}
创建一个名为$depthArray
的空数组并使用两个参数调用此函数,第一个是原始数组$this->phpArray
,第二个是$depthArray
,如下所示:
$depthArray = array();
traverseArray($this->phpArray, $depthArray);
最后,使用嵌套的foreach
循环来遍历$depthArray
并显示密钥,值以及相关的深度那个元素,像这样:
foreach($depthArray as $depth => $arr){
foreach($arr as $a){
echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
}
}