Создание дерева категорий в виде неупорядоченного списка HTML

Мне очень трудно понять концепцию создания дерева категорий. Это критерии:

  • Создайте неупорядоченный список родительского / дочернего HTML с неограниченной глубиной
  • Удалите все элементы со статусом = 0 и любыми детьми
  • Создать URL-адрес, например / одежда / джинсы
  • Необязательно: создание панировочных сухарей

Самое близкое решение, которое я смог найти, только смутил меня, потому что я не мог заставить их работать:

  • Преобразовать серию отношений родитель-ребенок в иерархическое дерево?
  • Создание рекурсивной функции дерева деревьев

Вот мой массив:

Array ( [0] => Array ( [id] => 1 [parent] => 0 [status] => 2 [slug] => clothes [title] => Clothes ) [1] => Array ( [id] => 2 [parent] => 1 [status] => 2 [slug] => jeans [title] => Jeans ) [2] => Array ( [id] => 3 [parent] => 1 [status] => 2 [slug] => dresses [title] => Dresses ) [3] => Array ( [id] => 4 [parent] => 0 [status] => 2 [slug] => accessories [title] => Accessories ) [4] => Array ( [id] => 5 [parent] => 4 [status] => 2 [slug] => bags [title] => Bags ) [5] => Array ( [id] => 6 [parent] => 4 [status] => 2 [slug] => watches [title] => Watches ) [6] => Array ( [id] => 7 [parent] => 6 [status] => 2 [slug] => rolex [title] => Rolex ) ) 

Это неупорядоченный список, который я хочу:

 <ul> <li><a href="/clothes">Clothes</a> <ul> <li> <a href="/clothes/jeans">Clothes</a> </li> <li> <a href="/clothes/dresses">Clothes</a> </li> </ul> </li> <li><a href="/accessories">Accessories</a> <ul> <li> <a href="/accessories/bags">Bags</a> </li> <li> <a href="/accessories/watches">Watches</a> <ul> <li> <a href="/accessories/watches/rolex">Rolex</a> </li> </ul> </li> </ul> </li> </ul> 

возможно, рекурсивная функция:

 function filter_by_parent($parent_id,$ar){ $retval=array(); foreach($ar as $a){ if($a['status']==0) continue; if($a['parent']==$parent_id) $retval[]=$a; } return $retval; } function print_list($parent, $level,$ar,$url_prefix) { $children = filter_by_parent($parent,$ar); if(empty($children)) return; echo "<ul>"; foreach($children as $child){ // indent and display the title of this child <br> echo "<li>".$child['title']. "( {$url_prefix}{$child['slug']} )"; print_list($child['id'], $level+1,$ar,$url_prefix.$child['slug'].'/'); echo "</li>"; } echo "</ul>"; } print_list(0,0,$test,'/'); 

с вашим вводом, результатом будет:

  • Одежда (/ одежда)
  • -Jeans (/ одежда / джинсы)
  • -Дрезы (/ одежда / платья)
  • Аксессуары (/ аксессуары)
  • – Сумки (/ аксессуары / сумки)
  • -Watches (/ аксессуары / часы)

(это адаптированная версия: сохранение иерархических данных в базе данных )

Хорошо, у меня есть решение для вас с рекурсивной функцией. Если вы спешите, здесь вы можете найти полный код.

Остальная часть этого сообщения – просто объяснение того, как это работает.

Это ваш массив:

 $arr = array ( 0=> array ( 'id' => 1, 'parent' => 0, 'status' => 2, 'slug' => 'clothes', 'title' => 'Clothes' ), 1 =>array ( 'id' => 2, 'parent' => 1, 'status' => 2, 'slug' => 'jeans', 'title' => 'Jeans' ), 2=> array ( 'id' => 3, 'parent' => 1, 'status' => 2, 'slug' => 'dresses', 'title' => 'Dresses' ), 3=> array ( 'id' => 4, 'parent' => 0, 'status' => 2, 'slug' => 'accessories', 'title' => 'Accessories' ), 4 => array ( 'id' => 5, 'parent' => 4, 'status' => 2, 'slug' => 'bags', 'title' => 'Bags' ), 5 => array ( 'id' => 6, 'parent' => 4, 'status' => 2, 'slug' => 'watches', 'title' => 'Watches' ), 6 => array ( 'id' => 7, 'parent' => 6, 'status' => 2, 'slug' => 'rolex', 'title' => 'Rolex' ) ) ; 

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

Теперь, сначала я просматриваю массив и установил связь между родителями и детьми. Что я сделал, если у элемента с id 1 есть какие-то дети, все его дети войдут в индекс массива 1. Вот часть, которая сделала трюк для меня.

 $tree = array (); foreach ($arr as $val) { $tree [ $val['parent'] ] [] = $val; } 

Довольно простое право ??? 🙂

Это массив, который он генерирует из вашего массива после этой обработки:

 array(4) { [0]=> array(2) { [0]=> array(5) { ["id"]=> int(1) ["parent"]=> int(0) ["status"]=> int(2) ["slug"]=> string(7) "clothes" ["title"]=> string(7) "Clothes" } [1]=> array(5) { ["id"]=> int(4) ["parent"]=> int(0) ["status"]=> int(2) ["slug"]=> string(11) "accessories" ["title"]=> string(11) "Accessories" } } [1]=> array(2) { [0]=> array(5) { ["id"]=> int(2) ["parent"]=> int(1) ["status"]=> int(2) ["slug"]=> string(5) "jeans" ["title"]=> string(5) "Jeans" } [1]=> array(5) { ["id"]=> int(3) ["parent"]=> int(1) ["status"]=> int(2) ["slug"]=> string(7) "dresses" ["title"]=> string(7) "Dresses" } } [4]=> array(2) { [0]=> array(5) { ["id"]=> int(5) ["parent"]=> int(4) ["status"]=> int(2) ["slug"]=> string(4) "bags" ["title"]=> string(4) "Bags" } [1]=> array(5) { ["id"]=> int(6) ["parent"]=> int(4) ["status"]=> int(2) ["slug"]=> string(7) "watches" ["title"]=> string(7) "Watches" } } [6]=> array(1) { [0]=> array(5) { ["id"]=> int(7) ["parent"]=> int(6) ["status"]=> int(2) ["slug"]=> string(5) "rolex" ["title"]=> string(5) "Rolex" } } } 

Теперь основные части приходят в сценарий. Поскольку любой ребенок также может быть родителем некоторых детей, поэтому самым простым решением является рекурсия. Вот рекурсивная часть.

 function traverser ($array ,$arr) { if (! $arr) return; echo "<ul>" . "</br>"; foreach ($arr as $var ) { echo "<li>" . "</br>"; echo '<a href="/'.$var['slug'].'">'.$var['title'].'</a>'; if (isset ($array [$var['id'] ])) traverser ($array , $array [$var['id'] ] ) ; echo "</li>"; } echo "</ul>"; 

Здесь вы можете найти полный код.

Надеюсь, это поможет . Счастливое кодирование.