我正在尝试将树重建为平面阵列。我成功地将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"
}
答案 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
声明中的&符号 - 这意味着将数组参数作为参考传递。否则,将在每个函数调用上创建数组的副本。
函数内部函数允许在内部全局公开一个方便的接口,在递归之间传递一个额外的参数。
在你的特殊问题中,你似乎没有处理一棵树,而是处理一系列树木 - 你必须稍微修改我的例子。