У меня есть класс 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
}
Я думаю, что рекурсия может быть использована где-то. Я думал, что даже если эта функция
правильно строит структуру массива, мне все равно нужно как-то отображать все это.
Может быть, это отдельная функция? Может быть, эта отдельная функция дисплея
рекурсивно?
Я думаю, что было бы лучше, если бы это была одна функция.
В любом случае, спасибо за вашу помощь!
Вот ответ, который я создал, который я адаптировал 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));
Выход:
- Главная
- около
- Компания
- контакт
- офисы
- штат сотрудников
Других решений пока нет …