用 list 处理树状数据(邻接列表)

xuzuning 2013-07-22 09:26:51
加精
现有一个数组
$d = array(
array( '公告', 1, 0 ),
array( '文章', 2, 0 ),
array( '文章1', 3, 2 ),
array( '文章2', 4, 2),
array( '文章1评论', 5, 3 ),
array( '文章2评论', 6, 4 ),
array( '文章1评论1', 7, 3 ),
array( '文章1评论评论', 8, 5 ),
);
期望如下输出
公告
文章
文章1
文章1评论
文章1评论评论
文章1评论1
文章2
文章2评论

于是可以
foreach($d as $t) list($a[$pid][$id], $id, $pid) = $t;
得到
Array
(
[0] => Array
(
[1] => 公告
[2] => 文章
)

[2] => Array
(
[3] => 文章1
[4] => 文章2
)

[3] => Array
(
[5] => 文章1评论
[7] => 文章1评论1
)

[4] => Array
(
[6] => 文章2评论
)

[5] => Array
(
[8] => 文章1评论评论
)

)
可以看到,数据按第3列聚类了
于是再用一个递归函数就可实现数据的展示了
function foo($ar, $pid=0, $deep=0) {
foreach($ar[$pid] as $k=>$v) {
printf("%s%s\n", str_repeat(' ', $deep), $v);
if(isset($ar[$k])) foo($ar, $k, $deep+2);
}
}
调用 foo($a);
...全文
5865 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
拥有翅膀的鱼 2015-11-23
  • 打赏
  • 举报
回复
为什么我运行出来的结果不是这样的呢
devil7758 2015-10-03
  • 打赏
  • 举报
回复
学习了
C_B 2015-06-26
  • 打赏
  • 举报
回复
我刚才根据楼主的思路,也写了一个类似的无限分类树。
<?php
$d = array(
array( name=>'公告','id'=>1,'pid'=>0),
array( name=>'文章','id'=>2,'pid'=> 0),
array( name=>'文章1','id'=>3, 'pid'=>2),
array( name=>'文章2','id'=>4,'pid'=>2),
array( name=>'文章1评论1','id'=>5,'pid'=>3),
array( name=>'文章2评论','id'=>6,'pid'=>4),
array( name=>'文章1评论2','id'=>7,'pid'=>3),
array( name=>'文章1评论1评论','id'=>8,'pid'=>5),
);
function tree2(&$arr,$pid=0,$num=0){
foreach($arr as $k=>$v){
if($v['pid'] == $pid){
echo str_repeat(' ',$num).$v['name'].'<br/>';
unset($arr[$k]);
tree2($arr,$v['id'],$num+2);
}

}
}
tree2($d);
?>
sinat_21762089 2015-03-05
  • 打赏
  • 举报
回复
好厉害,学习了
qq_16951411 2014-06-28
  • 打赏
  • 举报
回复
在高版本PHP里,可能算是错误,因此要用兼容性写法替代 $a =array(); foreach($d as $t) $a[$t[2]][$t[1]] = $t[0];
小雨青年 2014-03-17
  • 打赏
  • 举报
回复
球问 我这里有个排序字段,需要对同级的菜单进行排序,要怎么写?
际遇_ 2014-03-16
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~~~
sjqzone 2013-11-05
  • 打赏
  • 举报
回复
引用 14 楼 ty1063554215 的回复:
不好意思,上面那个发错了。。。我不是故意的。。我是想试一下这个编辑器的功能
好样的。
wucl111 2013-11-04
  • 打赏
  • 举报
回复
foreach($d as $t) list($a[$pid][$id], $id, $pid) = $t; 这个数据处理真是不错的一种方法哦,真心赞一个!
店长dfdfdsfs 2013-08-12
  • 打赏
  • 举报
回复
受教了!
  • 打赏
  • 举报
回复
我也是来学习的
xuzuning 2013-08-05
  • 打赏
  • 举报
回复
树状数据的处理,我已经发过很多的代码了
本例的目的是让你体会一下 list 函数的用法
并且 php5.5 的 foreach 已经支持变量列表了

引用 52 楼 lumengabc 的回复:
有创意。是不是这样也行



foreach($d as $t) $a[$t[2]][$t[1]] = $t[0];
lumengabc 2013-08-05
  • 打赏
  • 举报
回复
有创意。是不是这样也行

foreach($d as $t) $a[$t[2]][$t[1]] = $t[0];
stneo1990 2013-08-04
  • 打赏
  • 举报
回复
简洁直观明了,这种能举一反三的例子最能让人受教了,多谢版主老大~!
wxllwjm 2013-08-04
  • 打赏
  • 举报
回复
观摩,学习,支持,接分
赵云十八般 2013-08-02
  • 打赏
  • 举报
回复
前面也做过这个,不过是直接写递归函数从数据库取的。
lazyboy_wu 2013-08-02
  • 打赏
  • 举报
回复
已阅..
www_7di_net 2013-08-02
  • 打赏
  • 举报
回复
很強大,又學到一招
duancheng 2013-08-02
  • 打赏
  • 举报
回复
xiaolaoshu_2001 2013-08-01
  • 打赏
  • 举报
回复
学习了
加载更多回复(39)

21,886

社区成员

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

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