【问题标题】:PHP RecursiveArrayIterator class get key-value pair recursivePHP RecursiveArrayIterator 类递归获取键值对
【发布时间】:2017-05-10 02:55:23
【问题描述】:

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

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

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

        )

)

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

谢谢!

【问题讨论】:

    标签: php arrays iterator


    【解决方案1】:

    当您使用RecursiveIteratorIterator 时,您可以设置不同的遍历模式。默认值为RecursiveIteratorIterator::LEAVES_ONLY。这就是为什么你只得到叶子,但不是所有的值(顺便说一下array_walk_recursive 具有相同的行为)。要访问所有元素,您需要将模式设置为RecursiveIteratorIterator::SELF_FIRST

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

    这里是working demo

    【讨论】:

    • @Gábor,不客气。迭代器的文档确实很糟糕,而且很难做到正确。
    【解决方案2】:

    或者,您可以使用这样的递归函数:

    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并显示该元素的keyvalue和关联的depth,像这样:

    foreach($depthArray as $depth => $arr){
        foreach($arr as $a){
            echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2015-06-21
      • 2014-04-10
      • 2021-10-29
      • 2014-07-21
      • 2015-03-13
      • 2014-10-22
      相关资源
      最近更新 更多