PHP实现无限极分类生成分类树的方法

yipeiwu_com6年前PHP代码库

本文实例讲述了PHP实现无限极分类生成分类树的方法。分享给大家供大家参考,具体如下:

现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出的数据就是如下的格式:

$arr = array(
  array("id" => 1 , "pid" => 0 , 'cat' => '栏目一'),
  array("id" => 2 , "pid" => 0 , 'cat' => '栏目二'),
  array("id" => 3 , "pid" => 1 , 'cat' => '栏目三'),
  array("id" => 4 , "pid" => 2 , 'cat' => '栏目四'),
  array("id" => 5 , "pid" => 1 , 'cat' => '栏目五'),
  array("id" => 6 , "pid" => 5 , 'cat' => '栏目六'),
  array("id" => 7 , "pid" => 5 , 'cat' => '栏目七'),
  array("id" => 8 , "pid" => 6 , 'cat' => '栏目八'),
  array("id" => 9 , "pid" => 1 , 'cat' => '栏目九'),
  array("id" => 10 , "pid" => 0 , 'cat' => '栏目十'),
  array("id" => 11 , "pid" => 10 , 'cat' => '栏目十一'),
  array("id" => 12 , "pid" => 11 , 'cat' => '栏目十二'),
  array("id" => 13 , "pid" => 2 , 'cat' => '栏目十三'),
  array("id" => 14, "pid" => 13 , 'cat' => '栏目十四')
);

不多说,直接上处理代码:

//生成无限极分类树
function make_tree($arr){
  $refer = array();
  $tree = array();
  foreach($arr as $k => $v){
    $refer[$v['id']] = & $arr[$k]; //创建主键的数组引用
  }
  foreach($arr as $k => $v){
    $pid = $v['pid'];  //获取当前分类的父级id
    if($pid == 0){
      $tree[] = & $arr[$k];  //顶级栏目
    }else{
      if(isset($refer[$pid])){
        $refer[$pid]['subcat'][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
      }
    }
  }
  return $tree;
}

测试运行:

$cat = make_tree($arr);
print_r($cat);

运行结果:

Array
(
  [0] => Array
    (
      [id] => 1
      [pid] => 0
      [cat] => 栏目一
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 3
              [pid] => 1
              [cat] => 栏目三
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 1
              [cat] => 栏目五
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 6
                      [pid] => 5
                      [cat] => 栏目六
                      [subcat] => Array
                        (
                          [0] => Array
                            (
                              [id] => 8
                              [pid] => 6
                              [cat] => 栏目八
                            )
                        )
                    )
                  [1] => Array
                    (
                      [id] => 7
                      [pid] => 5
                      [cat] => 栏目七
                    )
                )
            )
          [2] => Array
            (
              [id] => 9
              [pid] => 1
              [cat] => 栏目九
            )
        )
    )
  [1] => Array
    (
      [id] => 2
      [pid] => 0
      [cat] => 栏目二
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [cat] => 栏目四
            )
          [1] => Array
            (
              [id] => 13
              [pid] => 2
              [cat] => 栏目十三
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 14
                      [pid] => 13
                      [cat] => 栏目十四
                    )
                )
            )
        )
    )
  [2] => Array
    (
      [id] => 10
      [pid] => 0
      [cat] => 栏目十
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 11
              [pid] => 10
              [cat] => 栏目十一
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 12
                      [pid] => 11
                      [cat] => 栏目十二
                    )
                )
            )
        )
    )
)

如果大家需要这样的组装格式,或者需要该格式方便后续的处理,可以尝试此方法

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

php图像验证码生成代码

php图像验证码生成代码

本文实例为大家分享了php封装的一个生成图像验证码,供大家参考,具体内容如下 一、代码 index..php <!DOCTYPE html PUBLIC "-//W3C/...

PHP中usort在值相同时改变原始位置问题的解决方法

从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的: If two members compare as equal, their order...

PHP stripos()函数及注意事项的分析

定义和用法stripos() 函数返回字符串在另一个字符串中第一次出现的位置。 如果没有找到该字符串,则返回 false。 语法stripos(string,find,start)...

PHP网站安装程序制作的原理、步骤、注意事项和示例代码

1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装...

部署PHP项目应该注意的几点事项分享

在部署PHP项目时,有几点需要特别注意,也是初学者比较容易忽视的点: 一、下载WAMPServer后,如何安装配置? 二、如何通过客户端管理MySQL数据库? 三、如何通过IP地址访问P...