动态三级导航菜单,从数据库读取多维数组的问题

first236108 2017-07-05 10:02:10
想做个三级导航菜单如下所示:

菜单title和url都是从数据库中读取,结构如下:


我本是想把它构建成如下形式的数组,再在view模板中遍历出来,可是为什么第三级(也就是third数组不出来呢?),我的代码如下,另外,这样循环读取数据库,感觉效率也太差了,是不是有其它更好的方法,请指导一下:
class IndexController extends Controller {
public function index(){
$nav=M('nav');
$arr0=array();
$arr0=$nav->where('level=0')->select();
foreach ($arr0 as $key => $value) {
$arr0[$key]['second']=$nav->where("parent=%d",$value['id'])->select();
foreach ($arr0[$key]['second'] as $key2 => $value2) {
$arr0[$key]['second']['third']=$nav->where("parent=%d",$value2['id'])->select;
}
}
dump($arr0);
exit;
$this->assign("menu",$arr0);
$this->display();
}

array(4) {
[0] => array(6) {
["id"] => string(1) "2"
["level"] => string(1) "0"
["parent"] => string(1) "0"
["title"] => string(6) "产品"
["url"] => string(33) "localhost/main/index.php/product/"
["second"] => array(3) {
[0] => array(5) {
["id"] => string(1) "6"
["level"] => string(1) "1"
["parent"] => string(1) "2"
["title"] => string(12) "网站建设"
["url"] => string(1) "#"
}
[1] => array(5) {
["id"] => string(2) "11"
["level"] => string(1) "1"
["parent"] => string(1) "2"
["title"] => string(12) "微信开发"
["url"] => string(1) "#"
}
["third"] => NULL
}
}
[1] => array(6) {
["id"] => string(1) "3"
["level"] => string(1) "0"
["parent"] => string(1) "0"
["title"] => string(12) "解决方案"
["url"] => string(34) "localhost/main/index.php/solution/"
["second"] => array(1) {
[0] => array(5) {
["id"] => string(2) "15"
["level"] => string(1) "1"
["parent"] => string(1) "3"
["title"] => string(18) "通用解决方案"
["url"] => string(1) "#"
}
}
}
[2] => array(6) {
["id"] => string(1) "4"
["level"] => string(1) "0"
["parent"] => string(1) "0"
["title"] => string(12) "新闻资讯"
["url"] => string(30) "localhost/main/index.php/news/"
["second"] => array(0) {
}
}
[3] => array(6) {
["id"] => string(1) "5"
["level"] => string(1) "0"
["parent"] => string(1) "0"
["title"] => string(12) "关于我们"
["url"] => string(31) "localhost/main/index.php/about/"
["second"] => array(0) {
}
}
}
...全文
309 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
first236108 2017-07-20
  • 打赏
  • 举报
回复
还没人回答。。前几天自己憋出来了,/汗,逻辑错误,数据结构导论都还给老师了。。两种方法,贴出来以供参考: 第一种,分三次把导航层级从数据库取出来、
    public function nav(){
        $nav=M('nav');
        $arr=$arr0=$nav->where('level=0')->select();
        $arr1=$arr1_1=$nav->where('level=1')->select();//二级菜单
        $arr2=$nav->where('level=2')->select();
        foreach ($arr1 as $key1 => $value1) {
            foreach ($arr2 as $key2 => $value2) {
                if($value2['parent']==$value1['id']){
                    $arr1_1[$key1]['next'][]=$value2;
                }
            }
            
        }
        foreach ($arr0 as $key0 => $value0) {
            foreach ($arr1 as $key1 => $value1) {
                if($value1['parent']==$value0['id']){
                    $arr[$key0]['next'][]=$arr1_1[$key1];
                }
            }
        }
        unset($arr0,$arr1,$arr1_1,$arr2);
        $this->assign('nav',$arr);
        return $arr;
第二种,一次连接数据库,把三级导航全部读出来,再用数组操作‘
    public function columnlist(){
        $nav=M('nav')->select();
        $arr=$arr1=$arr2=array();
        foreach ($nav as $key => $value) {
            switch ($value['level']) {
                case 0:
                    $arr[]=$value;
                    break;
                
                case 1:
                    $arr1[]=$value;
                    break;
                case 2:
                    $arr2[]=$value;
                    break;
            }
        }
        unset($value);
        $arr0=$arr;
        $arr1_1=$arr1;
        foreach ($arr1 as $key1 => $value1) {
            foreach ($arr2 as $key2 => $value2) {
                if ($value2['parent']==$value1['id']) {
                    $arr1_1[$key1]['next'][]=$value2;
                }
            }
        }
        unset($value1,$value2);
        foreach ($arr as $key => $value) {
            foreach ($arr1 as $key1 => $value1) {
                if ($value1['parent']==$value['id']) {
                    $arr0[$key]['next'][]=$arr1_1[$key1];
                }
            }
        }
        unset($value,$value1);
        return $arr0;
    }
  • 打赏
  • 举报
回复
把表中的数据全读出来 在操作数组

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧