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导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
浅析php header 跳转
Jun 17 PHP
php中的常用魔术方法总结
Aug 02 PHP
php比较两个绝对时间的大小
Jan 31 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
php 可变函数使用小结
Jun 12 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
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php中Smarty模板初体验
2011/08/08 PHP
php调整服务器时间的方法
2015/04/03 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Python变量作用范围实例分析
2015/07/07 Python
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python实战教程之自动扫雷
2018/07/13 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
python如何求圆的面积
2020/07/01 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
实现向右循环移位
2014/07/31 面试题
英语自荐信常用语句
2013/12/13 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
云台山导游词
2015/02/03 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
导游词之河北白洋淀
2020/01/15 职场文书