1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* * The function usage:转换list为树形array. * Definition: 转换list为树形array. * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $level level标记字段 * @param string $level level标记字段 */ function list2tree($list, $pk='id',$pid = 'pid',$child = 'child',$root=0) { // 创建Tree $tree = array(); if(is_array($list)) { // 创建基于主键的数组引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] =& $list[$key]; }else{ if (isset($refer[$parentId])) { $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key]; } } } return $tree; } else { return false; } } |
1 |
1 |
利用B+树概念实现的,只用一次循环就可生成树形数组 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php /* * The function usage:利用B+树概念转换list为树形array. * Definition: 转换list为树形array. * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $pk 主键标记字段 * @param string $child tree中下级标记字段 * @param int $root 根节点pid值 */ function list2treeb($list, $pk='id', $pid='pid', $child='child', $root=0) { //定义目标数组 $tree = array(); //定义索引数组,用于记录节点在目标数组的位置 $ind = array(); //几个字段名 //排序函数 function list2treeb_cmd($a, $b) { //父节点字段名 $pid = 'pid'; if($a[$pid]==$b[$pid]) return 0; return $a[$pid]>$b[$pid]?1:-1; } //排序,为避免数据中父节点在子节点后面出现,这种情况在多次修改数据后经常会发生的 //排序的目的就是防止这种情况造成的混乱 uasort($list,'list2treeb_cmd'); foreach($list as $v) { $v[$child] = array(); //给每个节点附加一个child项 if($v[$pid] == 0) { $i = count($tree); $tree[$i] = $v; $ind[$v[$pk]] =& $tree[$i]; }else { $i = count($ind[$v[$pid]][$child]); $ind[$v[$pid]][$child][$i] = $v; $ind[$v[$pk]] =& $ind[$v[$pid]][$child][$i]; } } return $tree; } //测试数据 $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) ); //检查结果 print_r(list2treeb($ar)); ?> |