PHP RecursiveArrayIterator类获取递归键值对

PHP RecursiveArrayIterator类获取递归键值对,php,arrays,iterator,Php,Arrays,Iterator,我试图用PHP的工厂类编写一个自定义数组迭代器。我的问题:我需要所有数组的所有数据,例如,这里有一个简单的PHP数组: Array ( [authentication] => Array ( [basic] => Array ( [username] => guest [password] => guest

我试图用PHP的工厂类编写一个自定义数组迭代器。我的问题:我需要所有数组的所有数据,例如,这里有一个简单的PHP数组:

Array
(
    [authentication] => Array
        (
            [basic] => Array
                (
                    [username] => guest
                    [password] => guest
                )

            [filters] => Array
                (
                    [price] => 100
                    [owener] => me
                )

        )

)
我在PHP的doc页面上看到,我可以使用两个简单类,并使用simple 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

谢谢大家!

或者,您可以使用如下递归函数:

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 = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
    foreach($arr as $a){
        echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
    }
}
创建一个名为
$depthArray
的空数组,并使用两个参数调用此函数,第一个参数是原始数组
$this->phpArray
,第二个参数是this
$depthArray
,如下所示:

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 = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
    foreach($arr as $a){
        echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
    }
}
最后,使用嵌套的
foreach
循环遍历
$depthArray
并显示该元素的键、值和相关深度,如下所示:

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 = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
    foreach($arr as $a){
        echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
    }
}
foreach($depthArray as$depth=>$arr){
foreach($arr作为$a){
回显'depth:'.$a['depth'.'键:'.$a['key'.'值:'.$a['value'.].
; } }
使用时,可以设置不同的遍历模式。默认值是递归迭代器::只剩下。这就是为什么只得到叶子,而不是所有的值(顺便说一句,它们的行为是相同的)。要访问所有元素,需要先将模式设置为
递归迭代器::SELF\u

$iterator = new \RecursiveIteratorIterator(
    new \RecursiveArrayIterator($array),
    \RecursiveIteratorIterator::SELF_FIRST
);

这是。

@Gábor,不客气。迭代器的文档记录确实很糟糕,很难正确使用。