У меня есть следующий массив, который я хочу преобразовать в неупорядоченный список (HTML).
Array ( [0] => Array ( [url] => / [id] => 53a8717fe9ab5 [template] => home [title] => Home ) [1] => Array ( [url] => /about [id] => 53a871fe8b05b [template] => content [title] => About ) [2] => Array ( [url] => /about/sub [id] => 53cb88b7ed22d [template] => content [title] => About (sub) ) [3] => Array ( [url] => /about/sub/subsub [id] => 53cb88bc7d32d [template] => content [title] => About (subsub) ) [4] => Array ( [url] => /contact [id] => 53a8718981161 [template] => content [title] => Contact us ) )
Поэтому я пытаюсь создать многомерный массив из вышеописанного, который выглядит так:
Array ( [0] => / [1] => /about [about] => Array ( [0] => /about/sub [sub] => Array ( [0] => /about/sub/subsub ) ) [2] => /contact )
Но это до тех пор, пока я получаю … Не говоря уже о создании фактического <ul>
.
Любая помощь будет очень высоко ценится.
РЕДАКТИРОВАТЬ
Я сгенерировал рекурсивный <ul>
используя:
private function generateTree($from) { $to = []; foreach ( $from as $element ) { $path = explode('/', $element["url"]); if ( count($path) === 1 ) array_unshift($path, '/'); $_to = &$to; for ( $i = 0; $i < count($path)-1; $i++ ) { if ( !array_key_exists($path[$i], $_to) ) $_to[$path[$i]] = []; $_to = &$_to[$path[$i]]; print_r ( implode("/", $path)); echo "<br>"; } $_to[] = $element["url"]; } return $to[""]; }
И это мой ожидаемый результат:
<ul> <li><a href="/">Home</a></li> <li> <a href="/about">About</a> <ul> <li> <a href="/about/sub">About (sub)</a> <ul> <li><a href="/about/sub/subsub">About (subsub)</a></li> </ul> </li> </ul> </li> <li><a href="/contact">Contact</a></li> </ul>
Попробуйте такую функцию:
function ToUl($input){ echo "<ul>"; $oldvalue = null; foreach($input as $value){ if($oldvalue != null && !is_array($value)) echo "</li>"; if(is_array($value)){ ToUl($value); }else echo "<li>" + $value; $oldvalue = $value; } if($oldvalue != null) echo "</li>"; echo "</ul>"; }
[Редактировать]
Я оставлю функцию, которая создает li
для каждого массива, что проще, если это понадобится читателю:
function ToUl($input){ echo "<ul>"; foreach($input as $value) if(is_array($value)){ echo "<li>"; ToUl($value); echo "</li>"; }else echo "<li>" + $value + "</li>"; echo "</ul>"; }