PHP: вложенное меню с рекурсивной функцией, расширяющее только некоторые узлы (не все дерево)

У меня есть этот массив, называемый $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> 

Я легко получаю этот вывод:

  • Страница 1
    • Страница 1-1
      • Страница 1-1-1
      • Страница 1-1-2
      • Страница 1-1-3
    • Страница 1-2
      • Страница 1-2-1
      • Страница 1-2-2
      • Страница 1-2-3
    • Страница 1-3
  • Страница 2
    • Страница 2-1
      • Страница 2-1-1
      • Страница 2-1-2
      • Страница 2-1-3
    • Страница 2-2
    • Страница 2-3
  • Page 3
    • Страница 3-1
    • Страница 3-2
  • Page 4
    • Страница 4-1
  • Page 5

Все идет нормально.

Теперь я бы хотел, чтобы НЕ отображалось сразу все дерево, но глубже, когда пользователь нажимает на страницу / подстраницу, например:

URL: http://www.example.com/page.php , начальное состояние («развернуть» все элементы с parent = 0)

  • Страница 1
  • Страница 2
  • Page 3
  • Page 4
  • Page 5

URL: http://www.example.com/page.php?id=1 (развернуть все элементы с parent = 1)

  • Страница 1
    • Страница 1-1
    • Страница 1-2
    • Страница 1-3
  • Страница 2
  • Page 3
  • Page 4
  • Page 5

URL: http://www.example.com/page.php?id=6 (развернуть все элементы с parent = 6)

  • Страница 1
    • Страница 1-1
      • Страница 1-1-1
      • Страница 1-1-2
      • Страница 1-1-3
    • Страница 1-2
    • Страница 1-3
  • Страница 2
  • Page 3
  • Page 4
  • Page 5

И так далее

Кажется, миссия невозможна для меня, любая помощь, пожалуйста? заранее спасибо

Ты почти там. Только одна небольшая проблема: вместо 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']));