Простое рекурсивное дерево в PHP / MySQL

У меня есть эта таблица в MySQL:

id name mother 1 grandma 0 2 myuncle 1 3 mymom 1 4 me 3 5 mysister 3 6 myson 4 7 new_grandma_son 1 

Я almacenate эту информацию в массиве с именем data[]

 $data=array( array("id"=>1,"name"=>"grandma", "mother"=>0), array("id"=>2,"name"=>"myuncle", "mother"=>1), array("id"=>3,"name"=>"mymom", "mother"=>1), array("id"=>4,"name"=>"me", "mother"=>3), array("id"=>5,"name"=>"mysister", "mother"=>3), array("id"=>6,"name"=>"myson", "mother"=>4), array("id"=>7,"name"=>"new_grandma_son","mother"=>1) ); 

И для создания генеалогического дерева я использую эту рекурсивную функцию:

 function tree($data, $mom = 0, $level = 0){ foreach ($data as $row){ if ($row['mother'] == $mom) { echo str_repeat("-", $level).$row['name']."<br>"; tree($data, $row['id'], $level); } else $level++; } } 

Когда я вызываю tree($data); функций tree($data); он показывает это:

 grandma -myuncle (level 1) -mymom ----me (level 4??) ---------myson (level 9??) ----mysister ----new_grandma_son (level 4??) 

У меня ошибка в else $level++; , потому что добавляет уровни, когда $row['mother'] != $mom , проходя через все строки, но я не знаю, как это сделать. Кто-нибудь знает? Спасибо.

Решение (Frits van Campen):

  tree($data, $row['id'], $level+1); // (eliminate this else $level++; ) 

Благодаря!

 function tree($data,$mom=0,$level=0){ foreach($data as $row){ if($row['mother']==$mom){ echo str_repeat("-",$level).$row['name']."<br>"; tree($data,$row['id'],$level+1); } } } 

Я думаю, что это исправляет ваш код. Можете ли вы предоставить $data чтобы я мог проверить это?

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


     function categoryDropDown ($ categoryArray, $ parentId, $ level, $ options)
 {   
     $ Уровня ++;
     foreach ($ categoryArray как $ array)
     {
         if ($ array ['parentId'] == $ parentId)
         {
             $ opt = str_repeat (">>", $ level-1).  $ array ['name'];         
             $ options [$ array ['id']] = $ opt;
             $ newParent = $ array ['id'];              
             $ options = categoryDropDown ($ categoryArray, $ newParent, $ level, $ options);         
         }
     }   
     return $ options;    
 }

—-вывод—-

 // Array Key содержит идентификатор категории.


 массив
 (
     [1] => Электроника
     [2] => >> Мобильный
     [5] => >> >> Мобильные аксессуары
     [7] => >> >> >> Подкатегория 1
     [9] => >> >> >> Подкатегория 3
     [3] => >> Ноутбук
     [6] => >> >> Аксессуары для ноутбуков
     [8] => >> >> >> Подкатегория 2
     [10] => >> >> >> Подкатегория 4
     [4] => >> Планшет
     [11] => Основная категория 2
 )

Вы можете ссылаться на некоторую предварительную версию этого кода здесь. Как отобразить выделение нескольких выпадающих из массива в php?

Не могли бы вы просто заменить str_repeat("-", $level) на str_repeat("-", $row['mother']) ?

Или, может быть, в вашем случае str_repeat("-", $row['mother'] - 1) поскольку вы не хотите начинать с - перед бабушкой.