经常用php 生成树形结构,这里记录一遍
有两种方法
第一种是引用调用,特点是运行速度快,只需要循环一遍,但是无法动态修改里面数据
第二种是递归调用,可以动态调用数据
结论:
如果数据在几十条建议使用 递归调用。方便调整数据
如果数据大于100条,建议使用引用,然后返回到前端。通过前台递归循环动态修改数据。
function tree1($ar, $id='id', $pid='pid')
{$t=[];$tree=[];foreach ($ar as $v) $t[$v[$id]] = $v;foreach ($t as $key => $item) {if (isset($t[$item[$pid]])) {$t[$item[$pid]]['children'][] = &$t[$key];} else {$tree[] = &$t[$key];}}return $tree;
}function tree2($array, $id='id', $fu='fid',$pid=0,$level=1){$tree = [];foreach ($array as $key => $value) {if ($value[$fu] == $pid) {$value['children'] = tree2($array,$id,$fu,$value[$id],$level+1);$value['level']=$level;$tree[] = $value;}}return $tree;
}$data = array(array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子'),);$c = tree1($data, 'ID', 'PARENT');
$t1=microtime();
Print_r($c);
$t2=microtime();var_dump($t1);
var_dump($t2);$c = tree2($data, 'ID', 'PARENT');
$t3=microtime();
Print_r($c);
$t4=microtime();var_dump($t3);
var_dump($t4);