【问题标题】:Organize multidimensional array using Recursion使用递归组织多维数组
【发布时间】:2012-08-19 21:06:29
【问题描述】:

我有一个动态构建的数组。由于它的构建方式,它有很多嵌套数组,但是深度对我来说没用,所以我在之后组织它。它可能看起来像这样:

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;
}

它在大多数情况下都有效,但原始数组中的某些值(其中确实有一个“成本”索引)无法添加到新数组中,因为它们本身是作为嵌套数组传递的,就像这样:

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

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

...而不仅仅是(大多数时候我得到的):

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

我认为使用 RecursiveIterator 的全部意义在于深入数组并获取其中没有数组的条目(即我想要的“值”)。我是否为这项工作使用了错误的工具?如果是这样,循环遍历我不知道深度的数组会更合适吗?如果 SPL 是要走的路,我做错了什么?

提前致谢。

【问题讨论】:

  • 你期望得到什么输出?
  • 你不能有两个同名的键,所以如果你在键'cost'下有一堆嵌套的值,你会失去一个,只有一个。相反,你的数据结构是什么,你想要什么结果?
  • 我在问题中添加了更多信息,包括展平之前数组可能看起来的示例。
  • @erisco:最终的数组仍然会有数字键,所以我不会覆盖每个条目(参见:$return[] = $value)。我只想去掉无限的深度,把它变成一个简单的二维数组,不管之前的样子。

标签: php recursion multidimensional-array


【解决方案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 的答案

【讨论】:

  • 我之前尝试过一次,但由于某种原因无法让它做我想做的事。无论如何,如果可能的话,我想坚持使用 RecursiveIterators,让它返回我期望它返回的东西,或者至少了解它为什么不返回。
  • 我已经改变了迭代器的顺序,但是我得到一个错误:“可捕获的致命错误:传递给 ParentIterator::__construct() 的参数 1 必须实现接口 RecursiveIterator,给定的 RecursiveIteratorIterator 实例.. 。”
  • @tbuteler 哦,是的,忘记移动参数了
  • Hmmm... 即使更改了参数的位置,仍然会出现相同的错误。
  • @tbuteler 省略了 RecursiveIteratorIterator 部分(通知未来的我,在您可以在发布前测试答案的机器上回答 qs)
猜你喜欢
  • 2017-12-28
  • 2017-11-28
  • 2019-02-20
  • 2017-02-26
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多