PHP简单的以递归获取菜单树,返回多维数组

数据结构

<?php
    $data = [
            ['id' => 1, 'name' => '顶级菜单0', 'parent_id' => 0],
            ['id' => 2, 'name' => '顶级菜单1', 'parent_id' => 0],
            ['id' => 3, 'name' => '二级菜单0', 'parent_id' => 1],
            ['id' => 4, 'name' => '二级菜单1', 'parent_id' => 1],
            ['id' => 5, 'name' => '二级菜单2', 'parent_id' => 1],
            ['id' => 6, 'name' => '二级菜单3', 'parent_id' => 2],
            ['id' => 7, 'name' => '二级菜单4', 'parent_id' => 2],
            ['id' => 8, 'name' => '三级菜单0', 'parent_id' => 6],
            ['id' => 9, 'name' => '三级菜单1', 'parent_id' => 3],
        ];

入口

  首先入口方法,先记录 parent_id =0 的顶层菜单树根

  

<?php 
  public function getMenuTree()
  {   
$parent_id = [];   foreach ($data as $key => $value) {   if ($value['parent_id'] === 0) {   $parent_id[$key] = $value;   }   }   $all_node_lists = setMenuTree($parent_id, $data); //用于检测是否有子菜单   return $all_node_lists;
  }

 

递归

递归所有子菜单,并复制到children上面进行记录

<?php
  public function setMenuTree(array $data = [], array $all_data = [])
   {
     foreach ($data as $data_key => $data_value) {
         $children = [];
           foreach ($all_data as $all_data_key => $all_data_value) {
             if ($all_data_value['parent_id'] == $data_value['id']) {
                 $children[] = $all_data_value;
               }
            }
            if (count($children) > 0) {
                $this->setMenuTree($children, $all_data);
                $data[$data_key]['children'] = $children;
            }
        }
        return $data;
    }

返回

  返回一个多维的跟类型数组

  

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 顶级菜单0
            [parent_id] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 二级菜单0
                            [parent_id] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 9
                                            [name] => 三级菜单1
                                            [parent_id] => 3
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 4
                            [name] => 二级菜单1
                            [parent_id] => 1
                        )

                    [2] => Array
                        (
                            [id] => 5
                            [name] => 二级菜单2
                            [parent_id] => 1
                        )

                )

        )

    [1] => Array
        (
            [id] => 2
            [name] => 顶级菜单1
            [parent_id] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [name] => 二级菜单3
                            [parent_id] => 2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 8
                                            [name] => 三级菜单0
                                            [parent_id] => 6
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 7
                            [name] => 二级菜单4
                            [parent_id] => 2
                        )

                )

        )

)

 

posted @ 2021-08-06 10:19  闪存第一涩  阅读(711)  评论(0)    收藏  举报