Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Рекурсия - Навигационная цепочка
Форумы портала PHP.SU » » Вопросы новичков » Рекурсия - Навигационная цепочка

Страниц (2): [1] 2 »
 

1. Saymor - 19 Апреля, 2013 - 11:09:00 - перейти к сообщению
Имеются данные в БД в виде "id", "parent", "info" при помощи рекурсии делаю многоуровневое меню. Всё прекрасно работает как надо.

Вопрос в том, как сделать навигационную цепочку (Навигационное меню, «Хлебные крошки») имея "id", "parent", "info"?

то есть исходя из того в какой из кактегорий во вложенности я нахожусь, надо формировать навигационную цепочку, типа:
Категория -> ПодКатегория -> ПодПодКатегория
2. OrmaJever - 19 Апреля, 2013 - 11:18:46 - перейти к сообщению
В чём проблема ити рекурсией в обратную строну?
3. Saymor - 19 Апреля, 2013 - 11:24:39 - перейти к сообщению
OrmaJever пишет:
В чём проблема ити рекурсией в обратную строну?

Улыбка хорошо, что вы меня поняли.
именно это понять и не могу!

вот пример моей рекурсии, которой я вывожу дерево каталогов
PHP:
скопировать код в буфер обмена
  1.  
  2. function myRecursia($option, $tree, $parent){
  3.     if(empty($tree[$parent])) return;
  4.    
  5.     echo "<ul>";
  6.     for($i=0, $n=count($tree[$parent]); $i<$n; $i++){
  7.        
  8.         echo '<li>';
  9.             echo $tree[$parent][$i]->name;
  10.             # РЕКУРСИЯ
  11.            myRecursia($option, $tree, $tree[$parent][$i]->id);
  12.         echo "</li>";
  13.     }
  14.     echo "</ul>";
  15.  }
  16.  
4. OrmaJever - 19 Апреля, 2013 - 11:54:10 - перейти к сообщению
покажите как вы вытягиваете из базы, и структуру масива $tree
5. Saymor - 19 Апреля, 2013 - 13:02:42 - перейти к сообщению
OrmaJever пишет:
покажите как вы вытягиваете из базы, и структуру масива $tree


Получаю масив $tree вида:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [5] => Array
  4.         (
  5.             [0] => stdClass Object
  6.                 (
  7.                     [id] => 8
  8.                     [name] => !!!_Новая категория
  9.                     [parent] => 5
  10.                     [type] => category
  11.                 )
  12.  
  13.         )
  14.  
  15.     [1] => Array
  16.         (
  17.             [0] => stdClass Object
  18.                 (
  19.                     [id] => 9
  20.                     [name] => !!!_Новая категория
  21.                     [parent] => 1
  22.                 )
  23.  
  24.             [1] => stdClass Object
  25.                 (
  26.                     [id] => 10
  27.                     [name] => !!!_Новая категория
  28.                     [parent] => 1
  29.                 )
  30.  
  31.             [2] => stdClass Object
  32.                 (
  33.                     [id] => 7
  34.                     [name] => 444
  35.                     [parent] => 1
  36.                 )
  37.  
  38.         )
  39.  
  40.     [0] => Array
  41.         (
  42.             [0] => stdClass Object
  43.                 (
  44.                     [id] => 18
  45.                     [name] => Ворота
  46.                     [parent] => 0
  47.                 )
  48.  
  49.             [1] => stdClass Object
  50.                 (
  51.                     [id] => 15
  52.                     [name] => Гарнитуры
  53.                     [parent] => 0
  54.                 )
  55.  
  56.             [2] => stdClass Object
  57.                 (
  58.                     [id] => 16
  59.                     [name] => Дополнения
  60.                     [parent] => 0
  61.                 )
  62.  
  63.             [3] => stdClass Object
  64.                 (
  65.                     [id] => 11
  66.                     [name] => Категория порше
  67.                     [parent] => 0
  68.                 )
  69.  
  70.             [4] => stdClass Object
  71.                 (
  72.                     [id] => 1
  73.                     [name] => Кухни
  74.                     [parent] => 0
  75.                 )
  76.  
  77.             [5] => stdClass Object
  78.                 (
  79.                     [id] => 12
  80.                     [name] => Офис
  81.                     [parent] => 0
  82.                 )
  83.  
  84.             [6] => stdClass Object
  85.                 (
  86.                     [id] => 2
  87.                     [name] => Спальни
  88.                     [parent] => 0
  89.                 )
  90.  
  91.             [7] => stdClass Object
  92.                 (
  93.                     [id] => 17
  94.                     [name] => Фурнитура
  95.                     [parent] => 0
  96.                 )
  97.  
  98.             [8] => stdClass Object
  99.                 (
  100.                     [id] => 13
  101.                     [name] => Шкафы
  102.                     [parent] => 0
  103.                 )
  104.  
  105.         )
  106.  
  107.     [3] => Array
  108.         (
  109.             [0] => stdClass Object
  110.                 (
  111.                     [id] => 5
  112.                     [name] => Деревянная спальня
  113.                     [parent] => 3
  114.                 )
  115.  
  116.             [1] => stdClass Object
  117.                 (
  118.                     [id] => 6
  119.                     [name] => Пластиковая спальня
  120.                     [parent] => 3
  121.                 )
  122.  
  123.         )
  124.  
  125.     [2] => Array
  126.         (
  127.             [0] => stdClass Object
  128.                 (
  129.                     [id] => 4
  130.                     [name] => Спальня взрослая
  131.                     [parent] => 2
  132.                 )
  133.  
  134.             [1] => stdClass Object
  135.                 (
  136.                     [id] => 3
  137.                     [name] => Спальня детская1
  138.                     [parent] => 2
  139.                 )
  140.  
  141.         )
  142.  
  143. )
  144.  


А вот результат работы рекурсии с этим массивом:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     Ворота
  3.     Гарнитуры
  4.     Дополнения
  5.     Категория порше
  6.     Кухни
  7.         !!!_Новая категория
  8.         !!!_Новая категория
  9.         444
  10.     Офис
  11.     Спальни
  12.         Спальня взрослая
  13.         Спальня детская1
  14.             Деревянная спальня
  15.                 !!!_Новая категория
  16.             Пластиковая спальня
  17.     Фурнитура
  18.     Шкафы
  19.  
6. OrmaJever - 19 Апреля, 2013 - 13:36:51 - перейти к сообщению
ну я хотел увидеть ещё запрос и цикл выборки в котором формируется масив $tree, его явно придётся изменить
7. Saymor - 19 Апреля, 2013 - 14:54:19 - перейти к сообщению
OrmaJever пишет:
ну я хотел увидеть ещё запрос и цикл выборки в котором формируется масив $tree, его явно придётся изменить


это само собой надо сформировать новый массив для данной операции,
вопрос в том, как сделать рекурсию в обратку?
я делаю 1 рапрос к БД, а дальше оперирую только с массивами.
8. LIME - 19 Апреля, 2013 - 17:39:18 - перейти к сообщению
Saymor погугли как хранятся деревья в реляционной бд
меньше будет циклов и рекурсий
(Добавление)
nested sets, materialized path
9. Saymor - 19 Апреля, 2013 - 18:40:25 - перейти к сообщению
LIME пишет:
Saymor погугли как хранятся деревья в реляционной бд
меньше будет циклов и рекурсий
(Добавление)
nested sets, materialized path

гуглил, "id", "parent", "info" идеальный вариант
10. LIME - 19 Апреля, 2013 - 18:43:17 - перейти к сообщению
ну ...дело твое))
11. Saymor - 19 Апреля, 2013 - 22:04:33 - перейти к сообщению
LIME пишет:
ну ...дело твое))

"id", "parent", "info" это же работает в выводе рекурсивно сложенных каталогов без ограничений.
я уверен что можно как-то сделать Навигационную цепочку без дополнительных параметров в БД
12. LIME - 19 Апреля, 2013 - 22:05:43 - перейти к сообщению
дополнительные поля лучше чем цикл запросов
13. Saymor - 19 Апреля, 2013 - 23:07:11 - перейти к сообщению
LIME пишет:
дополнительные поля лучше чем цикл запросов


стоп! о каком цикле запросов идет речь?!
запрос в моём случае всего один!
далее рекурсия работает только с массивом данных полученном при одноразовом запросе к БД
14. LIME - 19 Апреля, 2013 - 23:10:24 - перейти к сообщению
окау
это лучше чем без надобности выбирать дерево целиком
(Добавление)
хотя конечно это сильно завит от размера
15. Saymor - 19 Апреля, 2013 - 23:29:08 - перейти к сообщению
LIME пишет:
окау
это лучше чем без надобности выбирать дерево целиком
(Добавление)
хотя конечно это сильно завит от размера


ну проблема-то актуальна Подмигивание
вы подскажете чего умного?

 

Powered by ExBB FM 1.0 RC1