php+mysql查询实现无限下级分类树输出示例


Posted in PHP onOctober 03, 2016

本文实例讲述了php+mysql查询实现无限下级分类树输出。分享给大家供大家参考,具体如下:

这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类。给各位整理了几个php无限分类的例子.

树输出:

function get_array($user_id,$top=0){
global $mysql,$_G;
  $sql = "select user_id as name from `{spreads_users}`  where p1.spreads_userid='{$user_id}'";
$rows= $mysql->db_fetch_arrays($sql);
  if($top==1){
  $arr[0]['name']=$user_id;
  $arr[0]['children']=array();
  }
  $top=$top+1;
foreach ($rows as $key=>$value)
 {
     $r = get_array($value['name']); //调用函数,传入参数,继续查询下级
     $arr[0]['children'][$key]['name']= $value['username']; //组合数组
      if(is_array($r)){
      $arr[0]['children'][$key]['children']= $r[0]['children'];
      }
      $i++;
    }
    return $arr;
  }
$list = get_array("1000",1); //调用函数1000是顶级ID
echo 'var data='.json_encode($list);

这个是输出 Array 然后转让为 json

例子:

表结构:id字段为分类标识,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路径,储存该分类祖先的集合,isdir判断是否是目录,1为是,0为否.

显示函数:

//$count为分类等级
sort_list($str,$fatherid,$count)
{
$rs = $this->sql->re_datas("select * from sort where father_id = fatherid");
$num = $this->sql->sql_numrows();
$i=0;
$n = 1;
while(isset($rs[$i]))
{
$name = "";
for($n = 1 ; $n < $count ; $n )
{
$name.="│ ";
}
if($i 1==$num)
{
$name.="└─".$rs[$i][name];
}
else
{
$name.="├─".$rs[$i][name];
}
if($rs[$i][isdir])
{
$str.="<span style='color:#CCCCCC'>".$name."</span>";
}
else
{
$str.=$name";
}
$temp = $count 1;
$str = $this->sort_list($str,$rs[$i][id],$temp);
$i ;
}
return $str;
}

其中$this->sql对象为sql操作类对象,re_datas()函数返回查到的数组,sql_numrows()函数返回查询到的数目.

调用方法:

$sort_list = sort_list($sort_list,0,1);

例子:

表:category

id   int   主键,自增
name    varchar    分类名称
pid    int    父类id,默认0

顶级分类的 pid 默认就是0了,当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率.
先来构建一个原始数组,这个直接从数据库中拉出来就行:

$categories = array(
  array('id'=>1,'name'=>'电脑','pid'=>0),
  array('id'=>2,'name'=>'手机','pid'=>0),
  array('id'=>3,'name'=>'笔记本','pid'=>1),
  array('id'=>4,'name'=>'台式机','pid'=>1),
  array('id'=>5,'name'=>'智能机','pid'=>2),
  array('id'=>6,'name'=>'功能机','pid'=>2),
  array('id'=>7,'name'=>'超级本','pid'=>3),
  array('id'=>8,'name'=>'游戏本','pid'=>3),
);

目标是将它转化为下面这种结构:

电脑
—笔记本
——-超级本
——-游戏本
—台式机
手机
—智能机
—功能机

用数组来表示的话,可以增加一个 children 键来存储它的子分类:

array(
  //1对应id,方便直接读取
  1 => array(
    'id'=>1,
    'name'=>'电脑',
    'pid'=>0,
    children=>array(
      &array(
        'id'=>3,
        'name'=>'笔记本',
        'pid'=>1,
        'children'=>array(
          //此处省略
        )
      ),
      &array(
        'id'=>4,
        'name'=>'台式机',
        'pid'=>1,
        'children'=>array(
          //此处省略
        )
      ),
    )
  ),
  //其他分类省略
)

处理过程:

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
  $tree[$category['id']] = $category;
  $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
  if ($item['pid'] != 0) {
    $tree[$item['pid']]['children'][] = &$tree[$k];
  }
}

print_r($tree);打印结果如下:

Array
(
  [1] => Array
    (
      [id] => 1
      [name] => 电脑
      [pid] => 0
      [children] => Array
        (
          [0] => Array
            (
              [id] => 3
              [name] => 笔记本
              [pid] => 1
              [children] => Array
                (
                  [0] => Array
                    (
                      [id] => 7
                      [name] => 超级本
                      [pid] => 3
                      [children] => Array
                        (
                        )
                    )
                  [1] => Array
                    (
                      [id] => 8
                      [name] => 游戏本
                      [pid] => 3
                      [children] => Array
                        (
                        )
                    )
                )
            )
          [1] => Array
            (
              [id] => 4
              [name] => 台式机
              [pid] => 1
              [children] => Array
                (
                )
            )
        )
    )
  [2] => Array
    (
      [id] => 2
      [name] => 手机
      [pid] => 0
      [children] => Array
        (
          [0] => Array
            (
              [id] => 5
              [name] => 智能机
              [pid] => 2
              [children] => Array
                (
                )
            )
          [1] => Array
            (
              [id] => 6
              [name] => 功能机
              [pid] => 2
              [children] => Array
                (
                )
            )
        )
    )
  [3] => Array
    (
      [id] => 3
      [name] => 笔记本
      [pid] => 1
      [children] => Array
        (
          [0] => Array
            (
              [id] => 7
              [name] => 超级本
              [pid] => 3
              [children] => Array
                (
                )
            )
          [1] => Array
            (
              [id] => 8
              [name] => 游戏本
              [pid] => 3
              [children] => Array
                (
                )
            )
        )
    )
  [4] => Array
    (
      [id] => 4
      [name] => 台式机
      [pid] => 1
      [children] => Array
        (
        )
    )
  [5] => Array
    (
      [id] => 5
      [name] => 智能机
      [pid] => 2
      [children] => Array
        (
        )
    )
  [6] => Array
    (
      [id] => 6
      [name] => 功能机
      [pid] => 2
      [children] => Array
        (
        )
    )
  [7] => Array
    (
      [id] => 7
      [name] => 超级本
      [pid] => 3
      [children] => Array
        (
        )
    )
  [8] => Array
    (
      [id] => 8
      [name] => 游戏本
      [pid] => 3
      [children] => Array
        (
        )
    )
)

优点:关系清楚,修改上下级关系简单.

缺点:使用PHP处理,如果分类数量庞大,效率也会降低.

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

PHP 相关文章推荐
PHP脚本的10个技巧(3)
Oct 09 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
Laravel中使用Queue的最基本操作教程
Dec 27 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
Yii2框架自定义类统一处理url操作示例
May 25 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 #PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 #PHP
php简单统计中文个数的方法
Sep 30 #PHP
php简单实现多维数组排序的方法
Sep 30 #PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 #PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 #PHP
php结合md5的加密解密算法实例
Sep 30 #PHP
You might like
模拟flock实现文件锁定
2007/02/14 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
python进程与线程小结实例分析
2018/11/11 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
vue.js中created方法作用
2018/03/30 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
web.py在模板中输出美元符号的方法
2014/08/26 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
python try except 捕获所有异常的实例
2018/10/18 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Django密码存储策略分析
2020/01/09 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
客户代表实习人员自我鉴定
2013/09/27 职场文书
心得体会怎么写
2013/12/30 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
武当山导游词
2015/02/03 职场文书
手术室护士个人总结
2015/02/13 职场文书
班主任自我评价范文
2015/03/11 职场文书
优质服务标语口号
2015/12/26 职场文书
八年级作文之友谊
2019/12/02 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
mysql left join快速转inner join的过程
2021/06/30 MySQL
vue动态绑定style样式
2022/04/20 Vue.js