PHP读取数据库数据生成树形结构

时间:2022-05-06 11:36:03
地区表取の样式问题~~~
现在数据库有3000多条记录
数据库结构是
id   pid    name    ctype
1     0     中国      0
2     1     湖北      1
3     1     北京      1
4     2     武汉      2
5     2     武昌区    3
6     3     东城区    2
...........

数据库说明:
   id      数据id 这不说了吧
   pid    是隶属级的id,比如湖北属于中国,那么湖北 pid=中国的id
   name   是地区名
   ctype  是等级,共有 0,1,2,3,4    0是国家 1是省份   2是城市 以此类推哦


读取数据 页面上打印出以下样式
<li>
   <div>浙江</div>
    <ol>
        <li>
           <div>杭州</div>
              <ul>
                 <li>上城区< >
                 <li>下城区< >
                 <li>江干区< >
                 <li>西湖区< >
            </ul>
        </li>
        <li>宁波< >
        <li>绍兴< >
    </ol>
</li>


这个怎么做到啊



谢谢大家!!

4 个解决方案

#1


其实就是个类似于无限级分类的东东,你这里的ctype其实没什么作用,可以不要,给你一个简单递归输出的函数,当然格式和你要求的有点区别,你可以试着改改,数据库的读取也要改改哦

function get_category($category_pid=0,$category_level=1){
global $mysql;
$sql="select category_id,category_pid,category_name from categorys";
if($category_pid==0){
$sql.=" where category_pid=0";
}else{
$sql.=" where category_pid=$category_pid";
}
$sql.=" order by category_id asc";
$mysql->query($sql);
if($mysql->get_rows()){
$result=$mysql->get_rows_array();
foreach($result as $v){
if($category_level==1){
$k="  ";
}else{
for($i=1;$i<=$category_level;$i++){
$k.="  ";
}
}
$category=$k."L".$category_level.":".$v["category_name"]."<br/>";
$category_pid=$v["category_id"];
echo $category;
get_category($category_pid,$category_level+1);
}
}
}


调用:get_category(0),列出所有分类
这段代码的显示格式如下:

L1:浙江
  L2:杭州
    L3:上城区
    L3:下城区
    L3:江干区
    L3:西湖区
  L2:宁波
  L2:绍兴
L1:北京
L1:重庆
  L2:渝北区
    L3:两路镇
      L4:空港开发区

#2


ctype作用也是有,用来单独读取某一级别的名称。

#3


没好办法,除非是有序的,
正常情况下应该是逆归出来

#4


楼主做的东西也是我做的,大型项目~

#1


其实就是个类似于无限级分类的东东,你这里的ctype其实没什么作用,可以不要,给你一个简单递归输出的函数,当然格式和你要求的有点区别,你可以试着改改,数据库的读取也要改改哦

function get_category($category_pid=0,$category_level=1){
global $mysql;
$sql="select category_id,category_pid,category_name from categorys";
if($category_pid==0){
$sql.=" where category_pid=0";
}else{
$sql.=" where category_pid=$category_pid";
}
$sql.=" order by category_id asc";
$mysql->query($sql);
if($mysql->get_rows()){
$result=$mysql->get_rows_array();
foreach($result as $v){
if($category_level==1){
$k="  ";
}else{
for($i=1;$i<=$category_level;$i++){
$k.="  ";
}
}
$category=$k."L".$category_level.":".$v["category_name"]."<br/>";
$category_pid=$v["category_id"];
echo $category;
get_category($category_pid,$category_level+1);
}
}
}


调用:get_category(0),列出所有分类
这段代码的显示格式如下:

L1:浙江
  L2:杭州
    L3:上城区
    L3:下城区
    L3:江干区
    L3:西湖区
  L2:宁波
  L2:绍兴
L1:北京
L1:重庆
  L2:渝北区
    L3:两路镇
      L4:空港开发区

#2


ctype作用也是有,用来单独读取某一级别的名称。

#3


没好办法,除非是有序的,
正常情况下应该是逆归出来

#4


楼主做的东西也是我做的,大型项目~