读取树状数据的方法

xuzuning 2013-02-04 11:46:06
加精
读取树状数据的方法
一般在读取用“邻接列表算法”组织的数据时,需要使用递归逐层读取
或者读取数据到数组,然后用递归或非递归的方法再行处理
这里介绍一种边读边生成“树状”数组的方法,希望对你有用
mysql_connect();

//测试数据
$sql =<<< SQL
select * from (
select '1' as id, '0' as pid, 'Food' as title
union all select '2', '1', 'Fruit'
union all select '3', '2', 'Red'
union all select '4', '3', 'Cherry'
union all select '5', '2', 'Yellow'
union all select '6', '5', 'Banana'
union all select '7', '1', 'Meat'
union all select '8', '7', 'Beef'
union all select '9', '7', 'Pork'
) t
order by pid, id
SQL;

$rs = mysql_query($sql);

$res = array(); //结果数组
$ind = array(); //索引数组
while($row = mysql_fetch_assoc($rs)) {
list($id, $pid) = array_values($row);
$ind[$id] = $row;
if(isset($ind[$pid])) $ind[$pid]['child'][$id] =& $ind[$id]; //构造索引
if($pid == 0) $res[$id] =& $ind[$id]; //转存根节点组
}

echo '<xmp>' . print_r($res, 1);
Array
(
[1] => Array
(
[id] => 1
[pid] => 0
[title] => Food
[child] => Array
(
[2] => Array
(
[id] => 2
[pid] => 1
[title] => Fruit
[child] => Array
(
[3] => Array
(
[id] => 3
[pid] => 2
[title] => Red
[child] => Array
(
[4] => Array
(
[id] => 4
[pid] => 3
[title] => Cherry
)

)

)

[5] => Array
(
[id] => 5
[pid] => 2
[title] => Yellow
[child] => Array
(
[6] => Array
(
[id] => 6
[pid] => 5
[title] => Banana
)

)

)

)

)

[7] => Array
(
[id] => 7
[pid] => 1
[title] => Meat
[child] => Array
(
[8] => Array
(
[id] => 8
[pid] => 7
[title] => Beef
)

[9] => Array
(
[id] => 9
[pid] => 7
[title] => Pork
)

)

)

)

)

)
...全文
15865 96 打赏 收藏 转发到动态 举报
写回复
用AI写文章
96 条回复
切换为时间正序
请发表友善的回复…
发表回复
beatyou385981202 2014-12-02
  • 打赏
  • 举报
回复
mark
龙在唐朝 2014-07-30
  • 打赏
  • 举报
回复
学习,谢谢楼主分享
际遇_ 2013-06-21
  • 打赏
  • 举报
回复
好东西,冗余低,代码简洁!!!!感谢分享~~~
际遇_ 2013-06-21
  • 打赏
  • 举报
回复
其实这个是把递归的方法转化为迭代查询来解决是这样理解吗?
ywq0127 2013-06-06
  • 打赏
  • 举报
回复
修改版 http://bbs.csdn.net/topics/390481676
ywq0127 2013-06-05
  • 打赏
  • 举报
回复
大家写程序的,能不能都严谨一点,都没一个人去测试。 用下面这个数组去检测一下: 数据结构: 14 |---12 |---13 |---10 |---11

$arr = array(
    array(
        'id'=>10,
        'pid'=>13,
    ),
    array(
        'id'=>11,
        'pid'=>13,
    ),
    array(
        'id'=>12,
        'pid'=>14,
    ),
    array(
        'id'=>13,
        'pid'=>14,
    ),
    array(
        'id'=>14,
        'pid'=>0,
    ),
);
实际值肯定不是那样的。 这种方法必须要严格按照 父数据在子数据之前 的格式。 解决办法思考ing。。。
wangmineasy 2013-05-31
  • 打赏
  • 举报
回复
后面的没分?
梦康 2013-05-23
  • 打赏
  • 举报
回复
研究了两天,获益匪浅啊!
梦康 2013-05-22
  • 打赏
  • 举报
回复
晕,说的就是我么。。。我刚刚问了这个问题。。。。
astarblog 2013-05-16
  • 打赏
  • 举报
回复
刚学了两个月,但没看懂
wpj590246 2013-05-16
  • 打赏
  • 举报
回复
这引用用的好啊
joywto 2013-05-09
  • 打赏
  • 举报
回复
www.npsjw.com帮看下什么问题
屌丝码农 2013-05-03
  • 打赏
  • 举报
回复
引用 7 楼 natici 的回复:
=& 这个是运算符?
这就是个引用而已。。
屌丝码农 2013-05-03
  • 打赏
  • 举报
回复
多看几遍就能体会到了
年华似水118 2013-05-02
  • 打赏
  • 举报
回复
感谢版主
随行的太阳 2013-04-27
  • 打赏
  • 举报
回复
zilong 2013-04-19
  • 打赏
  • 举报
回复
顶 版主!!!!
iefinbba 2013-04-18
  • 打赏
  • 举报
回复
不错的思路,学习了
u010324010 2013-04-16
  • 打赏
  • 举报
回复
莫测,
wang8223538 2013-04-05
  • 打赏
  • 举报
回复
高深!
加载更多回复(69)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧