【问题标题】:Searching for a key in a multidimensional array then changing a value with PHP在多维数组中搜索一个键,然后用 PHP 更改一个值
【发布时间】:2011-09-18 23:55:49
【问题描述】:

我有一个看起来像这样的多维数组

[0] => Array
    (
        [recordId] => 5
        [leaf] => 1
        [children] => Array
            (
                [0] => Array
                    (
                        [recordId] => 6
                        [leaf] => 1
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [recordId] => 7
                                        [leaf] => 1
                                    )
                            )
                    )
                [1] => Array
                    (
                        [recordId] => 8
                        [leaf] => 1
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [recordId] => 9
                                        [leaf] => 1
                                    )
                                [1] => Array
                                    (
                                        [recordId] => 10
                                        [leaf] => 1
                                    )
                            )
                    )
            )
    )

每个节点都有一个默认为 TRUE 的“叶子”键,如果还有更多节点向下,则有一个“子”数组。

如果节点中包含“子”数组,我需要将“叶”键值设置为 FALSE。这样,只有最终节点具有 Leaf = TRUE 名称。

我尝试过搜索,但找不到代码来做我需要的事情,而且我无法理解我认为需要的递归函数。

有什么想法可以在 PHP 中完成吗?

感谢您的帮助。

【问题讨论】:

  • 请记住,1true 不是一回事。
  • 另外,我认为'leaf'源自没有任何子节点的节点,即(在我看来)叶子的定义(>它没有任何子节点)。
  • @Frits:所以一个空的children 数组应该是孩子还是不是?

标签: php arrays recursion tree multidimensional-array


【解决方案1】:

理论上这应该可行:

function findChild(&$array){
     foreach($array as &$arr){
            if(isset($arr['children'])){
                  $arr['leaf'] = 0; //there are children
                  findChild($arr['children']);
            }
            else {
                  $arr['leaf'] = 1; //there are no children
            }
     }
}

这是一个工作演示:http://codepad.org/AnYiRpES

【讨论】:

  • 注意& 的使用,它将参数转换为传递引用(因此它修改了原始数组)。
  • 这正是我所需要的(我不得不颠倒 1 和 0)。非常感谢。
  • @Chris -- 没问题 ^_^。你是什​​么意思你必须颠倒1和0?
  • 没关系。好的,没有意识到如果有孩子,叶子应该是0 ^_^
  • 如果它有孩子,你编写的代码会将叶子设置为 1(true)。我需要相反的情况,如果没有子节点,即分支中的最后一个节点,将叶子设置为 1。
【解决方案2】:

其实很简单:

function leafOrNotLeaf(array $array) {
    foreach ($array as $key => $sub) {
        if (isset($sub['children'])) {
            $array[$key]['leaf'] = false;
            $array[$key]['children'] = leafOrNotLeaf($sub['children']);
        }
    }
    return $array;
}

$new_array = leafOrNotLeaf($array);

【讨论】:

    【解决方案3】:

    走在实际的$array上:

    array_walk($array, $walker = function (&$node) use (&$walker) {
        $node['leaf'] = (int) empty($node['children'])
            OR array_walk($node['children'], $walker);
    });
    

    可能有点神秘,所以你一定喜欢 PHP。

    【讨论】:

    • “有点神秘”?去掉“位”:它很神秘。 +1无论如何都是为了创造力。 ;)
    • @netcoder 好的,让我们删除 bit$n='array';$l='leaf';$c='children';$f=$n."_walk";$f($$n, $b=function(&$m)use(&$b,$l,$c,$f){$m[$l]=(int)empty($m[$c])OR$f($m[$c],$b);}); ;)
    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多