построение меню начальной загрузки 4 с использованием рекурсивной функции - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь автоматизировать создание меню начальной загрузки с использованием массива. Вот как выглядит мой массив. Массив содержит основные элементы панели навигации, и если у элемента есть дочерние элементы, они сохраняются в виде значения в массиве как ключ ["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 Можно ли это сделать проще. А что я делаю не так.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...