代码如下:
$arr = array(
array('id'=>1,'name'=>'名称1','pid'=>0,'cid'=>2),
array('id'=>2,'name'=>'名称2','pid'=>0),
array('id'=>3,'name'=>'名称3','pid'=>0),
array('id'=>4,'name'=>'名称4','pid'=>0),
array('id'=>5,'name'=>'名称5','pid'=>0),
array('id'=>6,'name'=>'名称1-1','pid'=>1),
array('id'=>7,'name'=>'名称1-2','pid'=>1),
array('id'=>8,'name'=>'名称2-1','pid'=>2),
array('id'=>9,'name'=>'名称2-2','pid'=>2),
array('id'=>10,'name'=>'名称3-1','pid'=>3),
array('id'=>11,'name'=>'名称1-1-1','pid'=>6),
array('id'=>12,'name'=>'名称1-1-2','pid'=>6),
array('id'=>13,'name'=>'名称1-2-1','pid'=>7),
array('id'=>14,'name'=>'名称2-1-1','pid'=>8),
array('id'=>15,'name'=>'名称2-1-2','pid'=>8),
array('id'=>16,'name'=>'名称2-2-1','pid'=>9),
array('id'=>17,'name'=>'名称2-1-1-1','pid'=>14),
array('id'=>18,'name'=>'名称2-1-2-1','pid'=>15),
array('id'=>19,'name'=>'名称2-1-1-1-1','pid'=>17),
array('id'=>20,'name'=>'名称3-1-1','pid'=>10),
);
function getChildtree($data,$pid = 0,$level = 0){
static $result;
foreach ($data as $key => $info){
if($info['pid'] == $pid){
$info['level'] = $level;
$info['child'] = $info;
$result[] = $info;
unset($data[$key]);
getChildtree($data,$info['id'],$level+1);
}
}
return $result;
}
调用:
$childtree = $this->getChildtree($arr);
print_r($childtree);
这样不能处理成树形结构的,用静态变量怎么处理成树形结构的?
###不要使用静态变量来弄,这样的代码看着就像是刚刚学程序的人写的。思路应该是一层一层的。比如第一级$a[]=$one; 再使用引用的手段,把$one下面的赋值给他 $one[]=$two;这种应该你能很容易明白。当然 还可以使用其他手段。 这个算法其实也是有很多选择的,最差的O(n^2)复杂度。
###按照楼主的思路稍微修改了下代码,定义一个类:
class Tree {
private $_data = [];
function __construct($data) {
$this->_data = $data;
}
function child($pid, $level) {
$child = [];
foreach($this->_data as $v) {
if($pid == $v['pid']) {
$child[] = array_merge($v, [
'level' => $level,
'child' => $this->child($v['id'], $level + 1)
]);
}
}
return $child;
}
}
然后我们实例化Tree类,传入楼主的$arr,
$arr = array(
array('id'=>1,'name'=>'名称1','pid'=>0,'cid'=>2),
array('id'=>2,'name'=>'名称2','pid'=>0),
array('id'=>3,'name'=>'名称3','pid'=>0),
array('id'=>4,'name'=>'名称4','pid'=>0),
array('id'=>5,'name'=>'名称5','pid'=>0),
array('id'=>6,'name'=>'名称1-1','pid'=>1),
array('id'=>7,'name'=>'名称1-2','pid'=>1),
array('id'=>8,'name'=>'名称2-1','pid'=>2),
array('id'=>9,'name'=>'名称2-2','pid'=>2),
array('id'=>10,'name'=>'名称3-1','pid'=>3),
array('id'=>11,'name'=>'名称1-1-1','pid'=>6),
array('id'=>12,'name'=>'名称1-1-2','pid'=>6),
array('id'=>13,'name'=>'名称1-2-1','pid'=>7),
array('id'=>14,'name'=>'名称2-1-1','pid'=>8),
array('id'=>15,'name'=>'名称2-1-2','pid'=>8),
array('id'=>16,'name'=>'名称2-2-1','pid'=>9),
array('id'=>17,'name'=>'名称2-1-1-1','pid'=>14),
array('id'=>18,'name'=>'名称2-1-2-1','pid'=>15),
array('id'=>19,'name'=>'名称2-1-1-1-1','pid'=>17),
array('id'=>20,'name'=>'名称3-1-1','pid'=>10),
);
$Tree = new Tree($arr);
print_r($Tree->child(0, 0));
输出的打印结果:
Array
(
[0] => Array
(
[id] => 1
[name] => 名称1
[pid] => 0
[cid] => 2
[level] => 0
[child] => Array
(
[0] => Array
(
[id] => 6
[name] => 名称1-1
[pid] => 1
[level] => 1
[child] => Array
(
[0] => Array
(
[id] => 11
[name] => 名称1-1-1
[pid] => 6
[level] => 2
[child] => Array
(
)
)
[1] => Array
(
[id] => 12
[name] => 名称1-1-2
[pid] => 6
[level] => 2
[child] => Array
(
)
)
)
)
[1] => Array
(
[id] => 7
[name] => 名称1-2
[pid] => 1
[level] => 1
[child] => Array
(
[0] => Array
(
[id] => 13
[name] => 名称1-2-1
[pid] => 7
[level] => 2
[child] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => 2
[name] => 名称2
[pid] => 0
[level] => 0
[child] => Array
(
[0] => Array
(
[id] => 8
[name] => 名称2-1
[pid] => 2
[level] => 1
[child] => Array
(
[0] => Array
(
[id] => 14
[name] => 名称2-1-1
[pid] => 8
[level] => 2
[child] => Array
(
[0] => Array
(
[id] => 17
[name] => 名称2-1-1-1
[pid] => 14
[level] => 3
[child] => Array
(
[0] => Array
(
[id] => 19
[name] => 名称2-1-1-1-1
[pid] => 17
[level] => 4
[child] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => 15
[name] => 名称2-1-2
[pid] => 8
[level] => 2
[child] => Array
(
[0] => Array
(
[id] => 18
[name] => 名称2-1-2-1
[pid] => 15
[level] => 3
[child] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => 9
[name] => 名称2-2
[pid] => 2
[level] => 1
[child] => Array
(
[0] => Array
(
[id] => 16
[name] => 名称2-2-1
[pid] => 9
[level] => 2
[child] => Array
(
)
)
)
)
)
)
[2] => Array
(
[id] => 3
[name] => 名称3
[pid] => 0
[level] => 0
[child] => Array
(
[0] => Array
(
[id] => 10
[name] => 名称3-1
[pid] => 3
[level] => 1
[child] => Array
(
[0] => Array
(
[id] => 20
[name] => 名称3-1-1
[pid] => 10
[level] => 2
[child] => Array
(
)
)
)
)
)
)
[3] => Array
(
[id] => 4
[name] => 名称4
[pid] => 0
[level] => 0
[child] => Array
(
)
)
[4] => Array
(
[id] => 5
[name] => 名称5
[pid] => 0
[level] => 0
[child] => Array
(
)
)
)