• php递归获取无限分类菜单


    从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现。

    <?php 
    class Menu {
        public $menu = array(
          array('id'=>1,  'title'=>"一级1",'pid'=>0),
         array('id'=>2,  'title'=>"一级2",'pid'=>0),
         array('id'=>3,  'title'=>"二级11",'pid'=>1),
         array('id'=>4,  'title'=>"二级12",'pid'=>1),
         array('id'=>5,  'title'=>"二级21",'pid'=>2),
            array('id'=>6,  'title'=>"二级22",'pid'=>2),
         array('id'=>7,  'title'=>"三级1",'pid'=>3),
         array('id'=>8,  'title'=>"三级2",'pid'=>3),
           );
    
        public function __construct() {
             return $this->getMenu();
        }
        /**
         * 主菜单pid为0
         * @return array
         */     
        protected function getMenu() {
            foreach ($this->menus as $key => $items) {
                if ($items['pid'] == "0" ) {
                    unset($this->menu[$key]);
                    $menu[] = $this->buildMenuTree($items, $items['id']);
                }
            }
            return $menu;
        }
        /**
         * 生产多级菜单树
         * @param array $items
         * @param int $rid
         * @return array
         */
        protected function buildMenuTree($items,$rid) {
            $childs = $this->getChildMenu($items, $rid);
            if (isset($childs['child'])) {
                foreach ($childs['child'] as $key => $value) {
                    $children = $this->buildMenuTree($value, $value['id']);
                    if (null != $children['child']) {
                        $childs['child'][$key]['child'] = $children['child'];
                    }
                }
            }
            return $childs;
        }
        
        /**
         * 获取子菜单
         *
         */
        protected function getChildMenu($items,$rid) {
            foreach ($this->menu as $key => $value) {
                if ($value['pid'] == $rid) {
                    unset($this->menu[$key]);
                    $items['child'][] = $value;
                }
            }
            return $items;
        }
        
    }
    
    
    var_dump(new Menu);        

    测试结果为:
    array(2) {
      [0] => array(4) {
        ["id"] => int(1)
        ["title"] => string(7) "一级1"
        ["pid"] => int(0)
        ["child"] => array(2) {
          [0] => array(4) {
            ["id"] => int(3)
            ["title"] => string(8) "二级11"
            ["pid"] => int(1)
            ["child"] => array(2) {
              [0] => array(3) {
                ["id"] => int(7)
                ["title"] => string(7) "三级1"
                ["pid"] => int(3)
              }
              [1] => array(3) {
                ["id"] => int(8)
                ["title"] => string(7) "三级2"
                ["pid"] => int(3)
              }
            }
          }
          [1] => array(3) {
            ["id"] => int(4)
            ["title"] => string(8) "二级12"
            ["pid"] => int(1)
          }
        }
      }
      [1] => array(4) {
        ["id"] => int(2)
        ["title"] => string(7) "一级2"
        ["pid"] => int(0)
        ["child"] => array(2) {
          [0] => array(3) {
            ["id"] => int(5)
            ["title"] => string(8) "二级21"
            ["pid"] => int(2)
          }
          [1] => array(3) {
            ["id"] => int(6)
            ["title"] => string(8) "二级22"
            ["pid"] => int(2)
          }
        }
      }
    }
  • 相关阅读:
    Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能
    【C语言】不使用大小于号,求出两数最大值
    软件project—思考项目开发那些事(一)
    linux下误删数据文件恢复
    C++中stringstream ostringstream istringstream使用方式
    谈谈c++纯虚函数的意义!
    CountDownTimer完整具体演示样例
    Flex 正則表達式 电话、邮箱验证
    DIV+CSS两种盒子模型(W3C盒子与IE盒子)
    图论--欧拉路,欧拉回路(小结)
  • 原文地址:https://www.cnblogs.com/zz123/p/4115675.html
Copyright © 2020-2023  润新知