fork(6) download
  1. <?php
  2. ///gist.github.com/max-dark/f39028cc106ed32e8ce1b55a11643b43
  3.  
  4. /**восстанавливает дерево по таблице связей
  5.  * @param $data array
  6.  * @return array
  7.  */
  8. function restore_tree($data)
  9. {
  10. $lst = prepare_parents($data);
  11.  
  12. foreach ($lst as &$parent) {
  13. restore_tree_impl($parent, $lst);
  14. }
  15. return $lst[null];
  16. }
  17.  
  18. /** восстановление связей родитель->дети
  19.  * @param $parent array
  20.  * @param $data array
  21.  * @return void
  22.  */
  23. function restore_tree_impl(&$parent, &$data) {
  24. foreach ($parent['child'] as &$child) {
  25. // Если текущий ребенок сам является родителем
  26. if (array_key_exists($child['id'], $data)) {
  27. // восстановить связь
  28. $child['child'] = $data[$child['id']]['child'];
  29. // проверить детей
  30. restore_tree_impl($child, $data);
  31. } else {
  32. $child['child'] = [];
  33. }
  34. }
  35. }
  36. function make($id) {
  37. return ['id' => $id, 'title' => '[root]', 'child' => []];
  38. }
  39. /**Создает список узлов, имеющих датей
  40.  * @param $data $data
  41.  * @return array
  42.  */
  43. function prepare_parents($data) {
  44. $res = [];
  45. foreach ($data as $item) {
  46. $parent = $item['parent_id'];
  47. if (!array_key_exists($parent, $res)) {
  48. $res[$parent] = make($parent);
  49. if (array_key_exists($parent, $data)) {
  50. $res[$parent]['title'] = $data[$parent]['title'];
  51. }
  52. }
  53. unset($item['parent_id']);
  54. array_push($res[$parent]['child'], $item);
  55. }
  56. $data = $res;
  57. return $data;
  58. }
  59.  
  60. function show($item, $level) {
  61. if ($item['id'] === null) return;
  62. while ($level --> 0) {
  63. echo '..';
  64. }
  65. echo $item['title'].PHP_EOL;
  66. }
  67.  
  68. function print_tree($data, $level = -1) {
  69. show($data, $level);
  70. foreach ($data['child'] as $item) {
  71. print_tree($item, $level + 1);
  72. }
  73. }
  74.  
  75. $data = [
  76. ['id'=>0, 'title'=>'Электроника', 'parent_id' => null],
  77. ['id'=>1, 'title'=>'Компьютеры', 'parent_id' => 0],
  78. ['id'=>2, 'title'=>'ПК', 'parent_id' => 1],
  79. ['id'=>3, 'title'=>'Ноутбуки', 'parent_id' => 1],
  80. ['id'=>4, 'title'=>'Мобильные телефоны', 'parent_id' => 0],
  81. ['id'=>5, 'title'=>'Бытовая химия', 'parent_id' => null],
  82. ['id'=>6, 'title'=>'Порошок', 'parent_id' => 5],
  83. ['id'=>7, 'title'=>'Мыло', 'parent_id' => 5],
  84. ['id'=>8, 'title'=>'Трансформеры', 'parent_id' => 3],
  85. ];
  86.  
  87. $root = restore_tree($data);
  88.  
  89. print_tree($root);
  90.  
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
Электроника
..Компьютеры
....ПК
....Ноутбуки
......Трансформеры
..Мобильные телефоны
Бытовая химия
..Порошок
..Мыло