У меня есть этот массив, называемый $nested
(он длинный, но я попытался получить всеобъемлющий сценарий):
Array ( [1] => Array ( [id] => 1 [parent] => 0 [title] => Page 1 ) [2] => Array ( [id] => 2 [parent] => 0 [title] => Page 2 ) [3] => Array ( [id] => 3 [parent] => 0 [title] => Page 3 ) [4] => Array ( [id] => 4 [parent] => 0 [title] => Page 4 ) [5] => Array ( [id] => 5 [parent] => 0 [title] => Page 5 ) [6] => Array ( [id] => 6 [parent] => 1 [title] => Page 1-1 ) [7] => Array ( [id] => 7 [parent] => 1 [title] => Page 1-2 ) [8] => Array ( [id] => 8 [parent] => 1 [title] => Page 1-3 ) [9] => Array ( [id] => 9 [parent] => 2 [title] => Page 2-1 ) [10] => Array ( [id] => 10 [parent] => 2 [title] => Page 2-2 ) [11] => Array ( [id] => 11 [parent] => 2 [title] => Page 2-3 ) [12] => Array ( [id] => 12 [parent] => 3 [title] => Page 3-1 ) [13] => Array ( [id] => 13 [parent] => 3 [title] => Page 3-2 ) [14] => Array ( [id] => 14 [parent] => 4 [title] => Page 4-1 ) [15] => Array ( [id] => 15 [parent] => 6 [title] => Page 1-1-1 ) [16] => Array ( [id] => 16 [parent] => 6 [title] => Page 1-1-2 ) [17] => Array ( [id] => 17 [parent] => 6 [title] => Page 1-1-3 ) [18] => Array ( [id] => 18 [parent] => 7 [title] => Page 1-2-1 ) [19] => Array ( [id] => 19 [parent] => 7 [title] => Page 1-2-2 ) [20] => Array ( [id] => 20 [parent] => 7 [title] => Page 1-2-3 ) [21] => Array ( [id] => 21 [parent] => 9 [title] => Page 2-1-1 ) [22] => Array ( [id] => 22 [parent] => 9 [title] => Page 2-1-2 ) [23] => Array ( [id] => 23 [parent] => 9 [title] => Page 2-1-3 ) )
С помощью этой рекурсивной функции:
function recursive($parent, $array) { $has_children = false; foreach($array as $key => $value) { if ($value['parent'] == $parent) { if ($has_children === false && $parent) { $has_children = true; echo '<ul>' ."\n"; } echo '<li>' . "\n"; echo '<a href="/page.php?id=' . $value['id'] . '">' . $value['title'] . '</a>' . " \n"; echo "\n"; recursive($key, $array); echo "</li>\n"; } } if ($has_children === true && $parent) echo "</ul>\n"; } <ul><?php echo recursive(0, $nested); ?></ul>
Я легко получаю этот вывод:
Все идет нормально.
Теперь я бы хотел, чтобы НЕ отображалось сразу все дерево, но глубже, когда пользователь нажимает на страницу / подстраницу, например:
URL: http://www.example.com/page.php , начальное состояние («развернуть» все элементы с parent = 0)
URL: http://www.example.com/page.php?id=1 (развернуть все элементы с parent = 1)
URL: http://www.example.com/page.php?id=6 (развернуть все элементы с parent = 6)
И так далее
Кажется, миссия невозможна для меня, любая помощь, пожалуйста? заранее спасибо
Ты почти там. Только одна небольшая проблема: вместо recursive($key, $array)
вам нужен recursive($key + 1, $array)
. Тем не менее, как говорили другие, это было бы намного лучше, если бы вы просто сгенерировали весь вывод с помощью PHP, а затем все это контролировали с помощью javascript. Перезагрузка страницы каждый раз, когда пользователь нажимает на элемент, на самом деле не очень хороший пользовательский интерфейс.
Наконец, это то, что я сделал, это работает очень хорошо:
// create array of ancestors' ID from current page function path($page = 0) { global $database_connApp, $connApp; // let's create arrays do { mysql_select_db($database_connApp, $connApp); $query_rsPage = "SELECT pages.pag_id FROM pages WHERE pages.pag_id = " . $page; $rsPage = mysql_query($query_rsPage, $connApp) or die(mysql_error()); $row_rsPage = mysql_fetch_assoc($rsPage); $bid[] = $row_rsPage['pag_id']; $page = $row_rsPage['pag_parent']; } while ($page > 0); // move to the last array index end($bid); $output = $bid; return $output; }
// create the menu function fmenu($parent, $array, $path) { $has_children = false; foreach($array as $key => $value) { if (in_array($value['parent'], $path)) { if ($value['parent'] == $parent) { if ($has_children === false && $parent) { $has_children = true; echo '<ul>' ."\n"; } $active = ($_GET['iData'] == $value['id']) ? ' class="active"' : ''; echo '<li' . $active . '>' . "\n"; echo '<a href="../pagine/' . $value['id'] . '/' . slugify($value['title']) . '.htm">' . html($value['title']) . '</a>' . " \n"; echo "\n"; fmenu($key, $array, $path); echo "</li>\n"; } } } if ($has_children === true && $parent) echo "</ul>\n"; }
echo fmenu(0, $nested, path($row_rsEdit['pag_id']));