无限级分类
2005-12-11  作者:amao  同分类文章
description:
题目为: 有一数组 $data, 储存着各种类别信息, 每个 Category 元素各有一个 parent_id 元素, 标明该类别的母类别, 母类别 id 为 0 者即为根类. 现在请把各子类别分别分配到其母类别之下, 形成一个类别树数组.

<?
//测试数据
$ar = array(
array(id=>1,pid=>0),
array(id=>2,pid=>0),
array(id=>3,pid=>2),
array(id=>4,pid=>0),
array(id=>5,pid=>3),
array(id=>6,pid=>1),
array(id=>7,pid=>1),
array(id=>8,pid=>6),
array(id=>9,pid=>7),
array(id=>10,pid=>9)
);

//排序函数
function cmd($a,$b) {
 if($a[pid]==$b[pid]) return 0;
 return $a[pid]>$b[pid]?1:-1;
}

//排序,为避免数据中父节点在子节点后面出现,这种情况在多次修改数据后经常会发生的
//排序的目的就是防止这种情况造成的混乱
uasort($ar,cmd);

//定义目标数组
$d = array();
//定义索引数组,用于记录节点在目标数组的位置
$ind = array();

foreach($ar as $v) {
 $v[child] = array(); //给每个节点附加一个child项
 if($v[pid] == 0) {
   $i = count($d);
   $d[$i] = $v;
   $ind[$v[id]] =& $d[$i];
 }else {
   $i = count($ind[$v[pid]][child]);
   $ind[$v[pid]][child][$i] = $v;
   $ind[$v[id]] =& $ind[$v[pid]][child][$i];
 }
}
//检查结果
echo "<pre>";
print_r($d);
echo "</pre>" ;
?>

 

教科书上说过, 任何递归都可以转化成循环



相关
免费 pdf 库类 library
用php模拟post来提交数据
File_Bittorrent
windows 下安装 php_imagick.dll(Image magick Functions)
utf-8为什么在国外流行了
email地址php检测
面向对象程序设计怎么设计对象
PHP5盗链函数(referfile)
点击后退按钮,需要重新录入数据,如何解决
置顶功能