Я пытаюсь автоматизировать создание меню начальной загрузки с использованием массива. Вот как выглядит мой массив. Массив содержит основные элементы панели навигации, и если у элемента есть дочерние элементы, они сохраняются в виде значения в массиве как ключ ["child"]
array(4) {
[0]=>
array(13) {
["id"]=>
string(1) "1"
["uuid"]=>
string(36) "0ed9840f-ec09-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(5) "Home2"
["menu_parent_uuid"]=>
string(1) "0"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "3"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "1"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-10-11 09:25:25"
["parent_id"]=>
string(1) "0"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(0)
}
[1]=>
array(14) {
["id"]=>
string(1) "2"
["uuid"]=>
string(36) "3c9f135f-ec09-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(5) "About"
["menu_parent_uuid"]=>
string(1) "0"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "2"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-10-11 09:26:42"
["parent_id"]=>
string(1) "0"
["child_menu_count"]=>
string(1) "2"
["level"]=>
int(0)
["child"]=>
array(2) {
[0]=>
array(13) {
["id"]=>
string(1) "9"
["uuid"]=>
string(36) "e02b2b81-fc8d-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(4) "me 2"
["menu_parent_uuid"]=>
NULL
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "1"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-11-01 09:56:29"
["parent_id"]=>
string(1) "2"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(1)
}
[1]=>
array(13) {
["id"]=>
string(2) "10"
["uuid"]=>
string(36) "d18bc8ca-fcad-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(4) "me 3"
["menu_parent_uuid"]=>
NULL
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "2"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-11-01 13:45:08"
["parent_id"]=>
string(1) "2"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(1)
}
}
}
[2]=>
array(13) {
["id"]=>
string(1) "3"
["uuid"]=>
string(36) "505cc96f-ec09-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(7) "Contact"
["menu_parent_uuid"]=>
string(1) "0"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "1"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "1"
["m_date"]=>
string(19) "2019-10-11 09:27:15"
["parent_id"]=>
string(1) "0"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(0)
}
[3]=>
array(14) {
["id"]=>
string(1) "4"
["uuid"]=>
string(36) "57539ff3-ec09-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(8) "Dropdown"
["menu_parent_uuid"]=>
string(1) "0"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "4"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "1"
["active"]=>
string(1) "1"
["m_date"]=>
string(19) "2019-10-11 09:27:27"
["parent_id"]=>
string(1) "0"
["child_menu_count"]=>
string(1) "2"
["level"]=>
int(0)
["child"]=>
array(2) {
[0]=>
array(14) {
["id"]=>
string(1) "6"
["uuid"]=>
string(36) "bd485b66-fc87-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(12) "another link"
["menu_parent_uuid"]=>
string(36) "57539ff3-ec09-11e9-96a4-7251a8f92bf7"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "1"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-11-01 09:12:33"
["parent_id"]=>
string(1) "4"
["child_menu_count"]=>
string(1) "1"
["level"]=>
int(1)
["child"]=>
array(1) {
[0]=>
array(13) {
["id"]=>
string(1) "8"
["uuid"]=>
string(36) "b67d535c-fc8b-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(2) "me"
["menu_parent_uuid"]=>
NULL
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "1"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-11-01 09:41:00"
["parent_id"]=>
string(1) "6"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(2)
}
}
}
[1]=>
array(13) {
["id"]=>
string(1) "7"
["uuid"]=>
string(36) "bd728646-fc87-11e9-96a4-7251a8f92bf7"
["menu_name"]=>
string(11) "yet another"
["menu_parent_uuid"]=>
string(36) "57539ff3-ec09-11e9-96a4-7251a8f92bf7"
["menu_type"]=>
string(12) "navbar-right"
["menu_sort"]=>
string(1) "2"
["page_uuid"]=>
string(36) "e57067c0-ec2b-11e9-96a4-7251a8f92bf7"
["dropdown"]=>
string(1) "0"
["active"]=>
string(1) "0"
["m_date"]=>
string(19) "2019-11-01 09:12:34"
["parent_id"]=>
string(1) "4"
["child_menu_count"]=>
string(1) "0"
["level"]=>
int(1)
}
}
}
}
Я использую 2 функции для построения панели навигации. Вот 2 функции
function build_navbar_child_menu($menus_arr, $menu_id){
$NavbarBuilderHtml = "";
foreach($menus_arr as $menu){
$id = $menu["id"];
$uuid = $menu["uuid"];
$menu_name = $menu["menu_name"];
$menu_parent_uuid = $menu["menu_parent_uuid"];
$page_uuid = $menu["page_uuid"];
$dropdown = $menu["dropdown"];
$active = $menu["active"];
$parent_id = $menu["parent_id"];
$child_menu_count = $menu["child_menu_count"];
$level = $menu["level"];
$m_id = "menu_item" . $id;
$is_dropdown = ($child_menu_count != 0) ? true : false;
$dropdown = "";
$dropdown_toggle = "";
$dropdown_attributes = "";
if($is_dropdown){
$dropdown = 'dropdown';
$dropdown_toggle = 'dropdown-toggle';
$dropdown_attributes = 'role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"';
}
$NavbarBuilderHtml .= '<a class="nav-link '.$dropdown_toggle.'" href="#" '.$dropdown_attributes.'>'.$menu["menu_name"];
$NavbarBuilderHtml .= ' <span class="sr-only">(current)</span>';
if(isset($menu["child"])){
$NavbarBuilderHtml .= '<div class="dropdown-menu" aria-labelledby="'.$menu_id.'">';
$NavbarBuilderHtml .= build_navbar_child_menu($menu["child"],$m_id);
$NavbarBuilderHtml .= '</div>';
}
$NavbarBuilderHtml .= '</a>';
}
return $NavbarBuilderHtml;
}
function build_navbar_menu($menus_arr){
$NavbarBuilderHtml = "";
foreach($menus_arr as $menu){
$id = $menu["id"];
$uuid = $menu["uuid"];
$menu_name = $menu["menu_name"];
$menu_parent_uuid = $menu["menu_parent_uuid"];
$page_uuid = $menu["page_uuid"];
$dropdown = $menu["dropdown"];
$active = $menu["active"];
$parent_id = $menu["parent_id"];
$child_menu_count = $menu["child_menu_count"];
$level = $menu["level"];
$m_id = "menu_item" . $id;
$is_dropdown = ($child_menu_count != 0) ? true : false;
$dropdown = "";
$dropdown_toggle = "";
$dropdown_attributes = "";
if($is_dropdown){
$dropdown = 'dropdown';
$dropdown_toggle = 'dropdown-toggle';
$dropdown_attributes = 'role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"';
}
$NavbarBuilderHtml .= '<li class="nav-item active '.$dropdown.'" data-page-uuid="'.$menu["page_uuid"].'" id='.$m_id.'>';
$NavbarBuilderHtml .= '<a class="nav-link '.$dropdown_toggle.'" href="#" '.$dropdown_attributes.'>'.$menu["menu_name"];
$NavbarBuilderHtml .= ' <span class="sr-only">(current)</span>';
if(isset($menu["child"])){
$NavbarBuilderHtml .= '<div class="dropdown-menu" aria-labelledby="'.$menu_id.'">';
$NavbarBuilderHtml .= build_navbar_child_menu($menu["child"],$m_id);
$NavbarBuilderHtml .= '</div>';
}
$NavbarBuilderHtml .= '</a>';
$NavbarBuilderHtml .= '</li>';
}
return $NavbarBuilderHtml;
}
, затем я вызываю build_navbar_menu (). если мы видим, что дочерний ключ является массивом, мы вызываем build_navbar_child_menu () для этого массива.
результат не тот, который я ожидаю. Вот мой результат:
<ul class="navbar-nav mr-auto">
<li class="nav-item active " data-page-uuid="e57067c0-ec2b-11e9-96a4-7251a8f92bf7" id="menu_item1"><a class="nav-link " href="#">Home2 <span class="sr-only">(current)</span></a></li>
<li class="nav-item active dropdown" data-page-uuid="e57067c0-ec2b-11e9-96a4-7251a8f92bf7" id="menu_item2"><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">About <span class="sr-only">(current)</span></a>
<div class="dropdown-menu" aria-labelledby=""><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></a><a class="nav-link " href="#">me 2 <span class="sr-only">(current)</span></a><a class="nav-link " href="#">me 3 <span class="sr-only">(current)</span></a></div>
</li>
<li class="nav-item active " data-page-uuid="e57067c0-ec2b-11e9-96a4-7251a8f92bf7" id="menu_item3"><a class="nav-link " href="#">Contact <span class="sr-only">(current)</span></a></li>
<li class="nav-item active dropdown" data-page-uuid="e57067c0-ec2b-11e9-96a4-7251a8f92bf7" id="menu_item4"><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown <span class="sr-only">(current)</span></a>
<div class="dropdown-menu" aria-labelledby=""><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></a><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">another link <span class="sr-only">(current)</span></a>
<div class="dropdown-menu" aria-labelledby="menu_item4"><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></a><a class="nav-link " href="#">me <span class="sr-only">(current)</span></a></div>
<a class="nav-link " href="#">yet another <span class="sr-only">(current)</span></a></div>
</li>
</ul>
Вы можете увидеть результат меню здесь http://qwertycon.com/new.php Можно ли это сделать проще. А что я делаю не так.
Заранее спасибо