问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php+mysql怎么实现无限级别分类,数据库怎么设计?一条SQL语句读出数据然后生成数组

发布网友 发布时间:2022-04-28 05:45

我来回答

3个回答

懂视网 时间:2022-04-28 10:06

本文实例讲述了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);

这个是输出 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处理,如果分类数量庞大,效率也会降低.

热心网友 时间:2022-04-28 07:14

CREATE TABLE IF NOT EXISTS `sq_cat_id_name` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(11) NOT NULL,
`cat_name` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=24 ;

INSERT INTO `sq_cat_id_name` (`id`, `fid`, `cat_name`) VALUES
(1, 0, '私有'),
(2, 0, 'no2'),
(3, 1, 'sdf'),
(4, 1, '美媚'),
(5, 1, '好吧'),
(7, 1, '美女'),
(8, 1, '帅哥'),
(9, 2, '笑笑'),
(10, 2, '美女拉拉'),
(11, 2, '好好'),
(12, 2, '小小'),
(13, 5, '好呀'),
(14, 5, '媚美'),
(15, 5, '好S呀'),
(16, 5, '妖美'),
(17, 1, '好呀'),
(18, 12, '好吧'),
(19, 13, '是呀'),
(20, 12, 'okokok'),
(21, 13, '是虹蜡虹'),
(22, 2, '就是这样子'),
(23, 2, '是的吗');

<?php
$link = mysql_connect( '127.0.0.1', 'root', '123456' ) or die( mysql_error() );
mysql_select_db( 'qqsq' );
mysql_set_charset( 'utf8' );

$sql = "SELECT * FROM sq_cat_id_name";

$result = mysql_query( $sql );
$ss = array();
while( $row = mysql_fetch_assoc( $result ) )
{
$ss[$row['fid']][$row['id']] = $row['cat_name'];
}
unset( $row );

mysql_close( $link );

var_mp( $ss );

echo '-------------------------------------------' . "\n";

function for_category( $ss = array(), $a2 )
{
echo "<ul>";
foreach ( $ss as $k => $v )
{
if ( isset( $a2[$k] ) && is_array( $a2[$k] ) )
{ echo "<li>$k $v";
for_category( $a2[$k], $a2 );
echo "</li>";
}
else{
echo "<li>$k $v</li>";
}
}
echo "</ul>";
}

for_category( $ss[0], $ss );

如用疑问请联系 php.xlxz.org

热心网友 时间:2022-04-28 08:32

你说的无限级别,不是树状无限吧,只是说类别的个数无限,级别只有两级,对吧

一般大类不会很多,可以使用一个字符来表示,例如用A~Z进行编码,A为新闻、B为体育、……

新闻的类别可以设置为字符类型,第一位表示大累,后面的表示小类,例如A001国际新闻、A002国内新闻、B001篮球、……

建立两个表,一个是新闻大类表,两个字段:大类代码、大类名称;另外一个类别表,也是两个字段:类别代码、类别名称

在你的新闻表里面,只使用一个字符类型的类别字段就可以了。

要产生你那样的树状目录输出,起始非常简单,只要你的SQL语句按照类别进行排序就行了,程序检测每一条数据是否和上面的类别相同,以确定前面是显示+还是|,仅此而已。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
正确的调搓丝板方法 正确的调搓丝板方法介绍 搓丝板失效的多种原因及如何预防? 副职领导签批公文技巧 上级审批意见怎么写 怎么卸摘网吧电脑上的“世界之窗”浏览器 怎么才能卸载世界之窗浏览器? 麻烦帮我翻译两个句子,谢谢,谢谢。 ...结构层次和结构关系 原理讲下 谢谢谢谢 老师讲过了我么听懂啊_百度... 这两个句子的主干是什么,谢谢谢谢 为什么会有人选择一辈子不结婚呢? discuz怎么设置阿里云oss远程附件 oss阿里云怎么设置自动上传文件 阿里云oss 上传及访问问题 上传图片到阿里云的OSS上,可以吗 怎么上传图片到阿里云? 文件上传问题。PHP些的云存储服务器,调用平台接口上传文件(例如阿里云等)。 求助阿里云服务器上传图片代码php版本 PHP如何使用阿里云oss 阿里云oss php上传图片问题 上传前把图片重命名之后再上传到oss 怎么写代码呢 Php调用手机发短信功能 好做么?PHP短信接口开发 PHP怎么连接数据库短信接口 可以直接调用开源代码PhpSMSAdmin里面发短信的接口吗? php短信接口怎么使用 我有移动提供的短信接口,请问怎么用php调用这些接口发送短信呢? php ci框架怎么对接短信接口 php短信接口是什么? 怎么做的?PHP常用短信接口 PHP短信接口代码详解,修改成能发的 php短信接口如何实现群发... 谁能给个示例的代码啊。。 PHP+MySQL无限分类语句 php无限级分类ul li如何格式输出? PHP无限级分类怎么查询 PHP无限级分类 大神请进:如何用PHP和MySQL实现无限分类相册 php无限分类怎么弄 PHP无限树形根统计数据 php无限级分类表的建立问题 请教高手:php实现n叉树遍历 php mysql数据库查询语句并输出 PHP MYSQL 查询 汇总数据并输出到页面。 PHP输出mysql查询! php+mysql 做树形可折叠二级菜单怎么做?超高分啊!求助!!! php已经查询到mysql里的数据 如何输出? PHP如何通过传引用的思想实现无限分类(代码 PHP无限级分组算法问题 急求PHP递归无限分类,当前位置写法 php递归无限分类缩进怎么做?? 急啊 php递归实现无极分类的一个问题 在laravel框架里面实现php前台无限分类怎么遍历数据