代码地址 : tpr_infinite_tree()
源码
function tpr_infinite_tree($data,$parent_index='parent_id',$data_index='id',$child_name='child'){
// $data = [
// ['id'=>1,'parent_id'=>0],
// ['id'=>2,'parent_id'=>3],
// ['id'=>3,'parent_id'=>1],
// ['id'=>4,'parent_id'=>2],
// ['id'=>5,'parent_id'=>6],
// ['id'=>6,'parent_id'=>7],
// ['id'=>7,'parent_id'=>5],
// ];
$items = [];
foreach ($data as $d){
$items[$d[$data_index]] = $d;
if(!isset($d[$parent_index]) || !isset($d[$data_index]) || isset($d[$child_name])){
return false;
}
}
$tree = [];$n=0;
foreach($items as $item){
if(isset($items[$item[$parent_index]])){
$items[$item[$parent_index]][$child_name][] = &$items[$item[$data_index]];
}else{
$tree[$n++] = &$items[$item[$data_index]];
}
}
return $tree;
}
阐释
参数
- $data 节点list数据
- $parent_index 父节点索引名,默认值parent_id
- $data_index 各节点索引名,默认值id
- $child_name 树状结构中子节点位存于父节点的属性值,默认值child
原理
根据节点id作为key值
单循环各节点,判断是否有父节点
若有父节点,则子节点绑定至父节点的child属性中
当出现a属于b,b属于c,c属于a这种死循环所属关系时,不会在$tree中体现