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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не пойму какой массив собрать чтобы было проще вывести как многоуровневое меню

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
3d_killer
Отправлено: 23 Июля, 2014 - 13:54:19
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




в базе меню выглядит как обычное дерево
id | parent | name

исходные данные это ID выбранного пункта, допустим выбран пункт из 3го уровня, соответственно мне надо вывести меню таким образом чтобы ветка была как бы открыта с этим уровнем (то есть добавлен определенный класс)
уровень вложенности неизвестен то есть должно получиться следующее (пример с открытой веткой)

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <ul class="catalog_tree">
  3.     <li class="first"><a><span></span>Первый</a></li>
  4.     <li><a><span></span>Второй</a></li>
  5.     <li><a><span></span>Третий</a></li>
  6.     <li><a><span></span>Четвертый</a></li>
  7.     <li class="active"><a><span></span>Первый</a>
  8.         <ul>
  9.             <li><a><span></span>Второй</a></li>
  10.             <li><a><span></span>Третий</a></li>
  11.             <li><a><span></span>Четвертый</a></li>
  12.             <li class="active"><a><span></span>Первый</a>
  13.                 <ul>
  14.                     <li><a><span></span>Второй</a></li>
  15.                     <li><a><span></span>Третий</a></li>
  16.                     <li class="active"><a><span></span>Четвертый</a></li>
  17.                     <li><a><span></span>Первый</a>
  18.                 </ul>
  19.             </li>
  20.             <li><a><span></span>Второй</a></li>
  21.             <li><a><span></span>Третий</a></li>
  22.             <li><a><span></span>Четвертый</a></li>
  23.         </ul>
  24.     </li>
  25.     <li><a><span></span>Второй</a></li>
  26.     <li><a><span></span>Третий</a></li>
  27.     <li><a><span></span>Четвертый</a></li>
  28.     <li><a><span></span>Первый</a></li>
  29.     <li><a><span></span>Второй</a></li>
  30.     <li><a><span></span>Третий</a></li>
  31.     <li><a><span></span>Четвертый</a></li>
  32.     <li><a><span></span>Первый</a></li>
  33.     <li><a><span></span>Второй</a></li>
  34.     <li><a><span></span>Третий</a></li>
  35.     <li><a><span></span>Четвертый</a></li>
  36. </ul>
  37.  


остальные ветки должны быть закрыты как в примере

и вот вопрос, какой собрать массив и как его потом попроще при выводе обработать?
(Добавление)
данный пункт последний в примере, то есть вложения дальше нет но класс такой нужен
CODE (html):
скопировать код в буфер обмена
  1. <li class="active"><a><span></span>Четвертый</a></li>

(Добавление)
а и этот пункт выбран в данный момент в примере
 
My status
 Top
Edwvee
Отправлено: 23 Июля, 2014 - 13:59:30
Post Id


Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июнь 2013  


Помог: 1 раз(а)




Можно класс типа дерева написать и у него два метода: для создания массива и для рендеринга. Будет как бы решение проблемы естественным образом.
 
 Top
3d_killer
Отправлено: 23 Июля, 2014 - 14:00:40
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




)))) очень помог и так есть класс, но какой массив собирать и как его попроще разложить
 
My status
 Top
Edwvee
Отправлено: 23 Июля, 2014 - 15:13:39
Post Id


Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июнь 2013  


Помог: 1 раз(а)




3d_killer пишет:
)))) очень помог и так есть класс, но какой массив собирать и как его попроще разложить

Ну так по пэрэнту отсортируй. И если у тебя дерево, то тебе нужно его корень(id = 0 условно говоря) знать чтобы иметь доступ к его частям. Если массив по пэренту будет отсортирован и не будет условий вроде у записи с id=2 parent=7(это уже корректность самих данных), то у тебя получится собрать дерево, потом останется только отобразить его рекурсивно, начиная с корня.
active свойство везде можно проще с помощью js присвоить. Либо в узле дерева хранить предка. Перебирать все узлы, и где найдется active=true, там запускать рекурсивно вверх присвоение active=true у верхних узлов.
Это конечно все будет больно бить при колве узлов от 1000.
Пс: еще вариант, не иметь в узле ссылку на узел-родитель, а написать рекурсивный метод isActive, который будет опрашивать узлы-потомки активны ли они, если активны то active=true и возвращать тоже true/
ППс: Если непонятно о чем я говорю, и устроит не высочайшая производительность(может можно как-то напрямую сделать), то могу грубо сделанное решение предоставить, как концепт пруф

(Отредактировано автором: 23 Июля, 2014 - 15:26:41)

 
 Top
3d_killer
Отправлено: 23 Июля, 2014 - 15:28:14
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




на js сделать легко только на сайте я хочу этого избежать, в адмике js и строится
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB