将树重建为平面阵列

时间:2014-12-04 15:16:43

标签: php arrays

我正在尝试将树重建为平面阵列。我成功地将parent_id归因于每个元素。

但现在我的问题是将每个元素存储在一个新的数组中,该数组位于函数之外。

我尝试了几种方式(ps:函数没有在调用它的同一页面中定义):

   function rebuildTreeAsFlatArray($source,$childrenPropertyName)          
   {     
       $myarray = array();
       foreach($source as $element)
       {

           if(isset($element["nodes"]))
           {
               $this->rebuildTreeAsFlatArray($element["nodes"],$childrenPropertyName);
           }
           array_push($myarray,$element);


       }
       return $myarray;
   }
$result = $arrayFunctionsTreeSaving->rebuildTreeAsFlatArray($tree,"nodes");

这给了我一个内部只有一个元素的数组,第一个。

我尝试使用全局:

function rebuildTreeAsFlatArray($source,$childrenPropertyName)          
   {     
       global $myarray;
       foreach($source as $element)
       {

           if(isset($element["nodes"]))
           {
               $this->rebuildTreeAsFlatArray($element["nodes"],$childrenPropertyName);
           }
           array_push($myarray,$element);                     
       }

   }
   $myarray = array();
   $arrayFunctionsTreeSaving->rebuildTreeAsFlatArray($tree,"nodes");

什么是重新: 警告:array_push()期望参数1为数组,给定

为null

最后但并非最不重要,但引用参数:

   function rebuildTreeAsFlatArray($source,$childrenPropertyName,array &$result)          
   {     

       foreach($source as $element)
       {

           if(isset($element[$childrenPropertyName]))
           {
               $this->rebuildTreeAsFlatArray($element[$childrenPropertyName],$childrenPropertyName,$result);
           }
           array_push($result,$element);                     
       }

   }
   $myarray = array();
   $arrayFunctionsTreeSaving->rebuildTreeAsFlatArray($tree,"nodes",$myarray);

这给了我:

Catchable Fatal Error: Argument 3 passed to NRtworks\GlobalUtilsFunctionsBundle\Services\arrayFunctionsTreeSaving::rebuildTreeAsFlatArray() must be of the type array, integer given

现在该怎么办?我迷路了

这是一个树例子:

array(10) {
    ["id"] = > int(6)["name"] = > string(9)"Subsidies" ["code"] = > string(6)"703000" ["sense"] = > string(2)"DR" ["lft"] = > int(11)["lvl"] = > int(2)["rgt"] = > int(20)["root"] = > int(1)["nodes"] = > array(2) {
        [0] = > array(10) {
            ["id"] = > int(29)["name"] = > string(13)"Subsidies USA" ["code"] = > string(6)"703200" ["sense"] = > string(2)"DR" ["lft"] = > int(12)["lvl"] = > int(3)["rgt"] = > int(13)["root"] = > int(1)["nodes"] = > array(0) {}
            ["$$hashKey"] = > string(3)"01Z"
        }
        [1] = > array(10) {
            ["id"] = > int(12)["name"] = > string(14)"Subventions FR" ["code"] = > string(6)"703100" ["sense"] = > string(2)"DR" ["lft"] = > int(14)["lvl"] = > int(3)["rgt"] = > int(19)["root"] = > int(1)["nodes"] = > array(0) {}
            ["$$hashKey"] = > string(3)"020"
        }
    }
    ["$$hashKey"] = > string(3)"00R"
}

3 个答案:

答案 0 :(得分:0)

我已将第一个函数更改为将第二个方法调用与之前的结果合并。我没有你班上的其余部分,所以功能未经测试。

function rebuildTreeAsFlatArray($source,$childrenPropertyName)          
 {     
   $myarray = array();
   foreach($source as $element)
   {

       if(isset($element["nodes"]))
       {
          $ret = $this->rebuildTreeAsFlatArray($element["nodes"],$childrenPropertyName); //modified
           array_merge($myarray, $ret); // added
       }
       array_push($myarray,$element);


   }
   return $myarray;
}

答案 1 :(得分:0)

错误消息的说明

  

以及什么是reuslt:警告:array_push()期望参数1为数组,给定为null

声明

global $myarray;

表示:让我们导入一个名为$myarray的全局变量。 变量应该存在。在您的情况下,它之前不存在 - 它被创建并初始化为null

要将$ myarray正确初始化为空数组,可以在函数前添加一行:

$myarray = array();

但是如你所知,全局变量并不是一个好的设计。

答案 2 :(得分:0)

深度优先搜索的常用方法是这样的:

function depthFirstPostfixSearch($theTree) {

    function theRecursion($subTree, &$accumulatingArray) {
        foreach($subTree["nodes"] as $node) {
            theRecursion($node, $accumulatingArray);
        }
        $accumulatingArray[] = $subTree;
    }

    $accumulatingArray = array();
    theRecursion($theTree, $accumulatingArray);
    return $accumulatingArray;
}

不要忘记theRecursion声明中的&符号 - 这意味着将数组参数作为参考传递。否则,将在每个函数调用上创建数组的副本。

函数内部函数允许在内部全局公开一个方便的接口,在递归之间传递一个额外的参数。

在你的特殊问题中,你似乎没有处理一棵树,而是处理一系列树木 - 你必须稍微修改我的例子。