递归PHP函数返回意外数组

时间:2014-10-01 21:12:47

标签: php arrays recursion

我有一个分层数据,我把它放在一个我称之为$ dt的数组中。比我有一个数组存储我称之为$ in的这些数据之间的关系。我创建了一个具有as参数的函数,初始索引,级别,数组$ dt和数组$ in。我正在调试该函数,但我不知道为什么在这个过程中子类丢失了。完整的代码是:

$dt = array(
  41=>array( "pk"=>41,"parentPk"=>30,"name"=>"car1"),
  15=>array("pk"=>15,"parentPk"=>11,"name"=>"food" ),
  70=>array("pk"=>70,"parentPk"=>30,"name"=>"car3" ),
  18=>array("pk"=>18,"parentPk"=>15,"name"=>"food1" ),
  49=>array("pk"=>49,"parentPk"=>30,"name"=>"car2" ),
  20=>array( "pk"=>20,"parentPk"=>15,"name"=>"food2"),
  30=>array("pk"=>30,"parentPk"=>11,"name"=>"car" )    
);
echo "<pre>";
 print_r($dt);
echo "</pre>";
$in=array(11=>array(15,30),15=>array(18,20),30=>array(41,49,70));
echo "<pre>";
 print_r($in);
echo "</pre>";

function fn_tree($parent_id, $level,$dt,$in) {

 if(is_null($parent_id)){
        $parent_id ="NULL";
   }

   if (isset($in[$parent_id])) {                

        foreach ($in[$parent_id] as $id) {

            $pk=$in[$parent_id];

            $arrEnd[$id]=str_repeat("-", $level*2) .$dt[$id]["name"];

           fn_tree($id, $level + 1,$dt,$in,$arrEnd);

        }        
 }    
return $arrEnd;
}


$arrEcho = fn_tree(11, 0, $dt, $in);

echo "<br>";
echo "result";
echo "<br>";
echo "<pre>";
 print_r($arrEcho);
echo "</pre>";
$desired = array(
  15=>"food",
  18=>"food1",
  20=>"food2",
  30=>"car",
  41=>"car1",
  49=>"car2",
  70=>"car3"
);

echo "<br>";
echo "desired";
echo "<br>";
echo "<pre>";
 print_r($desired);
echo "</pre>"; 

那么为什么函数会丢失子类?

输出是:

Array data
(
[41] => Array
    (
        [pk] => 41
        [parentPk] => 30
        [name] => car1
    )

[15] => Array
    (
        [pk] => 15
        [parentPk] => 11
        [name] => food
    )

[70] => Array
    (
        [pk] => 70
        [parentPk] => 30
        [name] => car3
    )

[18] => Array
    (
        [pk] => 18
        [parentPk] => 15
        [name] => food1
    )

[49] => Array
    (
        [pk] => 49
        [parentPk] => 30
        [name] => car2
    )

[20] => Array
    (
        [pk] => 20
        [parentPk] => 15
        [name] => food2
    )

[30] => Array
    (
        [pk] => 30
        [parentPk] => 11
        [name] => car
    )

)
Array relationship
(
[11] => Array
    (
        [0] => 15
        [1] => 30
    )

[15] => Array
    (
        [0] => 18
        [1] => 20
    )

[30] => Array
    (
        [0] => 41
        [1] => 49
        [2] => 70
    )

)

result
Array
(
[15] => food
[30] => car
)

desired
Array
(
[15] => food
[18] => food1
[20] => food2
[30] => car
[41] => car1
[49] => car2
[70] => car3
)

1 个答案:

答案 0 :(得分:1)

你的问题的线索是/应该是&#34;未定义的变量:arrEnd。&#34;如果您没有在可以看到此警告的环境中运行,则应尝试设置此类环境。如果您在这样的环境中运行,则应密切关注此警告和所有其他警告。

我不确定这里的约定只是提供一个线索或一个完整的答案,但继续提供一个相当完整的答案:似乎你打算通过引用传递arrEnd,但是根本没有传递它。

另外,我对你想要的输出感到有些困惑。实际上,你不是想要用双破折号显示层次结构的东西,如下所示?

Array
(
    [15] => food
    [18] => --food1
    [20] => --food2
    [30] => car
    [41] => --car1
    [49] => --car2
    [70] => --car3
)