2014-10-01 2 views
-1

У меня есть иерархические данные, которые я помещаю в массив, который я называю $ dt. Чем у меня есть массив, в котором хранятся отношения между этими данными, которые я называю $ in. Я создал функцию, которая имеет в качестве параметра, начальный индекс, уровень, массив $ dt массив $ in. Я отлаживал функцию, но не нашел, почему подкласс теряется во время процесса. Полный код:Рекурсивная функция PHP возвращает неожиданный массив

$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

Ключ к вашим проблемам/должен быть "Undefined переменное: arrEnd." Если вы не работаете в среде, где вы можете увидеть это предупреждение, вы должны попытаться настроить такую ​​среду. Если вы работаете в такой среде, вы должны внимательно следить за этим и всеми другими предупреждениями.

Я не уверен, что это соглашение, чтобы просто дать ключ или целый ответ, но продолжая давать достаточно полный ответ: кажется, что вы намеревались передать arrEnd по ссылке, но не передайте его вообще.

Кроме того, я немного смущен вашим желаемым выходом. Разве вы на самом деле не хотите чего-то с двойными штрихами, показывающими иерархию, как показано ниже?

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

Привет, bfd, я пробовал объявить перед функцией, но это не сработало. И да, он должен иметь 2 строки для каждой подкатегории. – zwitterion

+1

На самом деле, если я объявляю 'global $ dt, $ in, $ arrEnd;' внутри функции он будет работать, я не знаю, почему. – zwitterion

Смежные вопросы