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

coldplay.xixi
Freigeben: 2023-04-09 14:02:02
nach vorne
3343 人浏览过

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

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

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

【相关学习推荐:php编程(视频),mysql视频教程

树输出:

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);
Nach dem Login kopieren

这个是输出 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.="".$name."";
}
else
{
$str.=$name";
}
$temp = $count 1;
$str = $this->sort_list($str,$rs[$i][id],$temp);
$i ;
}
return $str;
}
Nach dem Login kopieren

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

调用方法:

$sort_list = sort_list($sort_list,0,1);
Nach dem Login kopieren

例子:

表: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),
);
Nach dem Login kopieren

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

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

用数组来表示的话,可以增加一个 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(
          //此处省略
        )
      ),
    )
  ),
  //其他分类省略
)
Nach dem Login kopieren

处理过程:

$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];
  }
}
Nach dem Login kopieren

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
        (
        )
    )
)
Nach dem Login kopieren

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

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

相关推荐:编程视频课程

以上是示例php+mysql查询实现无限下级分类树输出的详细内容。更多信息请关注PHP中文网其他相关文章!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!