树深度递归PHP数组

时间:2016-03-22 05:57:13

标签: php arrays recursion tree depth

我有以下数组,想要找到最大值。其树形结构的深度。但我的代码返回12,当它应该是4 ...我不太擅长递归,所以这有点让我疯狂!

数组声明:

function plotTree($arr, $indent=0, $mother_run=true){

    global $ini_array;
    global $depth;
    global $maxDepth;

    if ($mother_run) {
        // the beginning of plotTree. We're at rootlevel
        echo "start\n";
    }

    foreach ($arr as $key => $value) {
        if (is_array($value)) {
            foreach ($value as $subKey => $subValue) {
                if(in_array($subValue.".item", array_keys($ini_array['relation']))) {
                  $depth +=1;
                  plotTree($ini_array['relation'][$subValue.".item"],0,false);
                }
            }
            $maxDepth = $maxDepth < $depth ? $depth : $maxDepth;
        }
    }    

    if ($mother_run) {
        echo "end\n";
    }
}

递归函数:

  function updateFrame(){
      $("#myDiv").animate({left: '+=1px'}, 10, function(){
        window.requestAnimationFrame(updateFrame);
      });
    }


  updateFrame();

[更新}我不想查找尺寸数量。在上面的示例中,树结构如下:parent =&gt; cs =&gt; business =&gt;展

1 个答案:

答案 0 :(得分:0)

所以我看到你正在尝试根据关系来衡量深度&#39;在一个平面阵列而不是树的实际深度。

所以,我已经能够提出以下解释:

<?php

function getMaxDepth(array $arr, array $relations = array()) {
    if (empty($relations)) {
        return array_reduce($arr, function ($result, $elem) use ($arr) {
            return max($result, getMaxDepth($elem, $arr));
        });
    }

    // Return 1 + the depth of the deepest nested tree
    return 1 + array_reduce($arr, function ($max, $elem) use ($relations) {
        // If the field is not related to another field return the current max
        if (!in_array($elem . '.item', array_keys($relations))) {
            return $max;
        }

        // Return maximum of current maximum and the depth of related tree
        return max($max, getMaxDepth($relations[$elem . '.item'], $relations));
    }, 0);
}

像这样使用:

getMaxDepth($yourArray['relation']); // returns 4

首先,您应该避免使用全局变量或静态变量,尤其是在处理递归时。相反,我们希望通过将它作为函数参数传递来保存我们需要的所有内容。

第一个if语句将getMaxDepth()分别应用于每个子树,因为我们希望确保覆盖所有子树。

然后我们简单地返回最深层嵌套的深度&#39;树,如果有一个或0,并为当前元素添加一个。

希望将来能帮到你。