使用Recursion组织多维数组

时间:2012-08-19 21:06:30

标签: php recursion multidimensional-array

我有一个动态构建的数组。它有许多嵌套数组,因为它的构建方式,但深度对我来说是无用的,所以我在之后组织它。它看起来像这样:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [index] => -1
                                    [cost] => 0.189956571618
                                )
                        )         
                )
        )

    [1] => Array
        (
            [index] => -1
            [cost] => 2.18650011647
        )
)

我想几乎平整这个数组(即在所有条目上使用$ array [$ i] ['cost']访问它的数据,无论它们是否在我处理它们之前嵌套了深度)。到目前为止,我一直在使用SPL递归,其中包含以下内容:

function flatten($array) {
    $return = array();
    $it = new RecursiveIteratorIterator(new ParentIterator(new RecursiveArrayIterator($array)), RecursiveIteratorIterator::SELF_FIRST);
    foreach($it as $value) {
        if(isset($value['cost'])) {
            $return[] = $value;
        }
    }
    return $return;
}

它在很大程度上起作用,但是原始数组中的某些值(其中包含'cost'索引)无法添加到新数组中,因为它们作为嵌套数组本身传递,如此:

Array
(
    [0] => Array
        (
            [index] => -1
            [cost] => 0.189956571618
        )

    [1] => Array
        (
            [index] => -1
            [cost] => 2.18650011647
        )
)

...而不仅仅是(我大部分时间都是这样):

Array
        (
            [index] => -1
            [cost] => 0.189956571618
        )

我认为使用RecursiveIterator的重点是深入数组并获取其中没有数组的条目(即我想要的'值')。我是否使用错误的工具来完成这项工作?如果是这样,循环一个我不知道深度的数组会更合适吗?如果SPL是要走的路,我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你可以使用array_walk_recursive

修改

function flatten($array) {
    $return = array();
    array_walk_recursive($array, function($value, $key) use (&$return) {
        if(isset($value['cost']) $return[] = $value;
    });
    return $return;
}

关于SPL部分 EDIT 在聊天室进行长时间讨论,查看OP的回答