I need to make a menu with a submenu. Menu 'id' => 'parent1' = submenu 'parent' => 'parent1'. If parent has no child echo only parent. If parent has childrens insert all children inside parent. Maybe try with a for loop, or some other solution?
If a child exists, each submenu child should be inserted in its parent by id. How?
The code example should echo:
<div href="myurl">Parent 1
<div href="myurl">Child 1</div>
<div href="myurl">Child 2</div>
</div>
<div href="myurl">Parent 2
<div href="myurl">Child 3</div>
</div>
class menu {
public $id;
public $parent;
public $name;
public $url;
public function add_node($args) {
echo '
<div href="' . $args['url'] . '">' . $args['name'] . '
<div href="' . $args['url'] . '">' . $args['name'] . '</div>
</div>';
}
}
if (class_exists('menu')){
global $menu;
$menu = new menu();
}
function menu_parent_child(){
$args = array(
'id' => 'parent1',
'name' => 'Parent 1',
'url' => 'myurl'
);
$args = array(
'parent' => 'parent1',
'name' => 'Child 1',
'url' => 'myurl'
);
$args = array(
'parent' => 'parent1',
'name' => 'Child 2',
'url' => 'myurl'
);
$args = array(
'id' => 'parent2',
'name' => 'Parent 2',
'url' => 'myurl'
);
$args = array(
'parent' => 'parent2',
'name' => 'Child 3',
'url' => 'myurl'
);
}
CodePudding user response:
There are a few things wrong with your code. Here are some recommendations:
- You are overwriting the $args array in each iteration of the menu_parent_child() function, so only the last element gets added to the menu. You should create a new array for each element.
- You are not adding the elements to the menu. You should call the add_node() method of the $menu object for each element.
- You should not have an echo statement inside the add_node() method. Instead, you should return a string that represents the HTML for the menu element.
- You should have a separate method for adding submenu elements to a parent element.
- You should keep track of the elements in the menu in a separate data structure, such as an array or an object. This will allow you to easily check if an element has children and to add children to a parent element.
Here is some sample code that demonstrates how you could implement the menu with these changes:
<?php
class Menu {
private $elements = [];
public function add_node($args) {
$element = new stdClass();
$element->id = $args['id'];
$element->parent = $args['parent'] ?? null;
$element->name = $args['name'];
$element->url = $args['url'];
$element->children = [];
$this->elements[$element->id] = $element;
if ($element->parent) {
$this->elements[$element->parent]->children[] = $element;
}
}
public function get_html() {
$html = '';
foreach ($this->elements as $element) {
if (!$element->parent) {
$html .= $this->get_element_html($element);
}
}
return $html;
}
private function get_element_html($element) {
$html = '<div href="' . $element->url . '">' . $element->name;
if (count($element->children) > 0) {
$html .= '<div >';
foreach ($element->children as $child) {
$html .= $this->get_element_html($child);
}
$html .= '</div>';
}
$html .= '</div>';
return $html;
}
}
if (class_exists('Menu')) {
$menu = new Menu();
}
function menu_parent_child() {
global $menu;
$menu->add_node([
'id' => 'parent1',
'name' => 'Parent 1',
'url' => 'myurl',
]);
$menu->add_node([
'id' => 'child1',
'parent' => 'parent1',
'name' => 'Child 1',
'url' => 'myurl',
]);
$menu->add_node([
'id' => 'child2',
'parent' => 'parent1',
'name' => 'Child 2',
'url' => 'myurl',
]);
$menu->add_node([
'id' => 'parent2',
'name' => 'Parent 2',
'url' => 'myurl',
]);
$menu->add_node([
'id' => 'child1',
'parent' => 'parent2',
'name' => 'Child 1',
'url' => 'myurl',
]);
$menu->add_node([
'id' => 'child2',
'parent' => 'parent2',
'name' => 'Child 2',
'url' => 'myurl',
]);
}
menu_parent_child();
$html = $menu->get_html();
echo $html;`enter code here`