PHP树结构,实现无限分级

摘要:
ID唯一标识列。parentid是列的父ID,级别表示列的级别。下面的代码可以实现一个简单的树结构。2、 但是,在常规表结构中没有级别。另一个问题是根据级别设置缩进,因此看起来是分层的。

一、从数据库查出来的数据需要id、parentid、level。

  id唯一识别栏目,parentid为该栏目所属父类id,level标示该栏目是几级栏目。以下代码就可以实现一个简单的树结构。

 1 public function tree2(){
 2         $r = array(
 3             array(
 4                 'id'=>1,
 5                 'name'=>'智慧教育',
 6                 'parent_id'=>0,
 7                 'level'=>0 //一级分类
 8             ),
 9             array(
10                 'id'=>2,
11                 'name'=>'学校列表',
12                 'parent_id'=>1,
13                 'level'=>1 //二级分类
14             ),
15             array(
16                 'id'=>4,
17                 'name'=>'智慧医疗',
18                 'parent_id'=>0,
19                 'level'=>0 //一级分类
20             ),
21             array(
22                 'id'=>5,
23                 'name'=>'医院列表',
24                 'parent_id'=>4,
25                 'level'=>1 //二级分类
26             ),
27             array(
28                 'id'=>6,
29                 'name'=>'名医列表',
30                 'parent_id'=>5,
31                 'level'=>2 //三级分类
32             )
33 
34         );
35         //输出为select标签:
36         echo '<h1>PHPTree</h1>';
37         echo '<select  style="300px;">';
38         foreach($r as $item){
39             echo '<option>';
40             //根据所在的层次缩进
41             echo str_repeat('|—',$item['level']);
42             echo $item['name'];
43             echo '</option>';
44         }
45         echo '</select>';
46     }

  页面效果图是这样的。

    PHP树结构,实现无限分级第1张

二、但是一般表结构中是没有level的。

  这样就需要多层循环嵌套加if判断,先循环显示父级栏目parentid=0,及它就是一级栏目;然后再循环根据parentid与一级栏目的id判断,如果相等则显示对应的栏目,二级栏目就显示出来啦,以此类推,可以显示所有栏目。但这只适合已知栏目层数且层数不多的情况,因为要根据层数来判断遍历的次数。且如果层数过多,代码量就会很大。

 1 public function tree3(){
 2         //从表中查到所有栏目
 3         $cat = M('category');
 4         $allcat = $cat ->order('listorder ASC') ->select();
 5 
 6         //输出select标签
 7         echo '<h2>栏目tree</h2>';
 8         echo '<select  style="300px;">';
 9         foreach ($allcat as $val) {
10             if($val[parentid] == 0){
11                 echo '<option>';
12                 echo $val['catname'];
13                 echo '</option>';
14             }
15             foreach ($allcat as $value) {
16                 if($val[id] == $value[parentid]){
17                     echo '<option>';
18                     echo '|—'.$value['catname'];
19                     echo '</option>';
20                 }
21             }
22         }
23         ......
24     }

  那怎么知道栏目层数,或者怎么判断该栏目下面还有没有子栏目呢?

三、这里采用递归的方式

  这样就可以不断重复查询本身的pid等于上一级id的数据,通过判断查到的数据是否为空来判断它有没有子栏目。

  还有一个问题就是根据级别设置缩进,这样看着有层次感。那这个怎么实现呢?在php中有一个字符串函数str_repeat(),两个参数,第一个表示要重复的字符串,第二个是重复的次数。

  代码片段如下:

//递归实现无限级菜单
    public function tree2($pid=0,$level=0){
        $cat = M('category');
        $data = $cat ->where("parentid = $pid") ->field('id,catname,parentid') ->select();

        $level ++;
        if(!empty($data)){
            $tree = array();
            foreach ($data as $val) {
                $val['catname'] = str_repeat('|—', $level-1).$val['catname'];
                $child = $this ->tree2($val[id],$level);
                $tree[] = array('self'=>$val,'child'=>$child,'level'=>$level);
            }
        }
        return $tree;
    }

    function test(){
        $allcat = $this ->tree2(0);
        dump(json_encode($allcat));
    }

   上面tree2方法找到了所有栏目,并组装到tree数组中,tree是一个多维数组,现在要从数组中取出所有栏目名称catname,同样递归调用,代码如下:

//遍历找出所有catname
    function getcatname($array){
       if(is_array($array)){
         foreach ($array as $key=>$value ){
           if(is_array($value)){
             $this ->getcatname($value);           
            }else{
                $temp = array('key'=>$key,'value'=>$value);
                 if ($temp['key'] == 'catname') {
                     echo $temp['value']."<br/>";
                 }
            }
         }
       }
    }

    function test(){
        $allcat = $this ->tree2(0);
        $this ->getcatname($allcat);
    }

  页面显示效果图如下:

    PHP树结构,实现无限分级第2张

  这样就实现了多级栏目的显示。

免责声明:文章转载自《PHP树结构,实现无限分级》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇人工智能将完成审计的前99步工作(修订)6Java控制结构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP面试题之优化

* PHP性能问题 * 1.PHP语法使用的不恰当 * 2.使用PHP语言做了它不擅长的事 * 3.使用PHP语言链接的服务不给力 * 4.PHP自身做不了的事情 * * PHP的性能问题的解决方向 * 1.PHP语言级的性能优化(代码优化) * 2.PHP周边问题的性能优化(linux,mysql,磁盘等) * 3.PHP语言性能的优...

var_dump()函数输出不完整,有省略号?解决办法

php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符,较深的数组元素也被显示成省略号。这点会带来一些不便,我们修改配置文件,设置这些。在php.ini里的xdebug节点中,加入如下xdebug.var_dis...

laravel excel 导入

<pre name="code" class="php"> /**       * 导入       * 保存       * fyj       */       public function importexambank(Request $request)       {              // dd($examfilename...

(原创)LAMP搭建之一:图解如何安装并检查LAMP

LAMP搭建之一:图解如何安装并检查LAMP 第一步:安装Linux(RedHat5) 第二步:rpm -qa httpd(查看apache是否安装)     rpm -qa php(查看php是否安装)     rpm -qa mysql(查看mysql是否安装)     如果没有安装,用rpm -ivh 安装。 第三步:service httpd sta...

解决Class 'swoole_server' not found

1.看下cli模式是否可以正常工作,命令行下运行 php -r "echo php_sapi_name();" 这条命令就是在cli模式运行php语句,php -r就是run一条php命令的意思,php_sapi_name()判断当前执行的php是什么模式下,执行成功在屏幕上输出 cli,不成功说明你的php cli模式有问题。 2.查看当前cli已支...

php的下载与安装

一,进入到php的官方网站   https://www.php.net/   ,进入到下载页面: 选择 PHP 7.2.30 的Windows版本  具体的下载页面版本区分: 下载后,得到如下压缩包到如下目录   进入到php目录  D:wampphp7230 把文件  php.ini-development  复制一份,改名为  php.ini...