html — рекурсивная генерация вложенной навигации в переполнении стека

У меня есть класс PHP, который выглядит так:

class $nav_node {
public $id;
public $page_name;
public $parent_id;
public $page_content;
}

Моя цель состоит в том, чтобы создать функцию, которая принимает один из этих nav_nodes
и внедряет его в существующую вложенную навигационную структуру.

$nav_nodes = [];
function add_node($new_node) {

}

Я хочу построить вложенную структуру навигации просто с помощью HTML

<ul> and <li> tags ( nested )

Вот как будет выглядеть структура

Thing
thing2
thing3
thing4
thing5
thing6
thing7
Thing8
thing9

Это была моя первая попытка, но я нигде не видел, чтобы это произошло.

function add_node($new_node) {
global $nav_nodes;

if ( isset($nav_nodes[$new_node->id]) && !is_array($nav_nodes[$new_node->id]) ) {
$nav_node[$new_node->id] = [];
}

$nav_nodes[$new_node->id][] = $new_node;

// Display "new" nested structure
}

Я думаю, что рекурсия может быть использована где-то. Я думал, что даже если эта функция
правильно строит структуру массива, мне все равно нужно как-то отображать все это.
Может быть, это отдельная функция? Может быть, эта отдельная функция дисплея
рекурсивно?
Я думаю, что было бы лучше, если бы это была одна функция.

В любом случае, спасибо за вашу помощь!

1

Решение

Вот ответ, который я создал, который я адаптировал http://www.jugbit.com/php/php-recursive-menu-with-1-query/ это действительно отличный ответ. Очень минимальный / простой код.

class nav_node {
public $id;
public $page_name;
public $parent_id;
public $page_content;
public $items;

public function __construct($id, $page_name, $parent_id, $page_content)
{
$this->id = $id;
$this->page_name = $page_name;
$this->parent_id = $parent_id;
$this->page_content = $page_content;
}
}

class nav {
public function generate($nodes)
{
ob_start();
//echo var_dump(nav::create_array($nodes));
echo '<ul>';

foreach ($nodes as $node)
{
echo '<li>'.$node->page_name.'</li>';
if (count($node->items) > 0)
{
echo nav::generate($node->items);
}
}

echo '</ul>';
return ob_get_clean();
}

public function create_array($nodes, $parent = 0)
{
$out = array();
foreach($nodes as $node){
if($node->parent_id == $parent){
$out[$node->id] = $node;
$out[$node->id]->items = nav::create_array($nodes, $node->id);
}
}

return $out;
}
}

$nodes[] = new nav_node(
1,
'home',
null,
'hello world'
);
$nodes[] = new nav_node(
2,
'about',
null,
'hello world'
);
$nodes[] = new nav_node(
3,
'company',
2,
'hello world'
);
$nodes[] = new nav_node(
4,
'contact',
3,
'hello world'
);
$nodes[] = new nav_node(
6,
'offices',
3,
'hello world'
);
$nodes[] = new nav_node(
7,
'staff',
3,
'hello world'
);

//var_dump($nodes);

nav::generate(nav::create_array($nodes));

Выход:

  • Главная
  • около
    • Компания
      • контакт
      • офисы
      • штат сотрудников
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]