函数
/**
* 将线性数据转为树形数据
*
* @param array $arrData 需要转换的数据集
* @param string $strId 主键标记字段
* @param string $strPid 父级标记字段
* @param string $strChild 保存子集数组字段
* @param integer $parentId 需要生成某个父级ID
* @return void
*/
public function tree($arrData,$strId="id",$strPid="pid",$strChild="child" ,$parentId = 0)
{
if(!is_array($arrData)){
//如果不是数组返回空
return [];
}
//生成基于主键索引的数组进行引用
$arrList = array();
foreach($arrData as $k => $v){
$arrList[$v[$strId]] = &$arrData[$k];
}
$arrTree = [];//存放处理好的数据
//循环生成tree
foreach($arrData as $k => $v){
if($parentId == $v[$strPid]){
//找顶级部门,将现在遍历的顶级数组变量地址赋值给找到顶级分类
$arrTree[] = &$arrData[$k];
}else{
//如果不是顶级部门,进来通过之前生成基于主键索引的找他上级
if(isset($arrList[$v[$strPid]])){
//找到他上级
$arrChild = &$arrList[$v[$strPid]];//生成一个临时子集变量将他的父级数据地址写进去
$arrChild[$strChild][] = &$arrData[$k];//将他写进带他爸爸数据的临时子集变量里,因为是变量地址,所以修改修改时同步进行的,所以引用索引的地址改变后在数据源数组内也会跟着改变
}
}
}
return $arrTree;
}
变量前+&解释
把实参,也就是这个变量的地址传给函数,函数内的操作会直接影响到函数外面的值。也就是说,$a=”1234″ $b=&a 这时不管修改$a还是$b 这时打印哪个变量都是打印出修改后的值
$a= "123";
$b = &$a;
echo $a.' <- $a ------- $b -> '.$b.' <br>';
$a = '234';
echo $a.' <- $a ------- $b -> '.$b.' <br>';
$a = '345';
echo $a.' <- $a ------- $b -> '.$b.' <br>';
exit;
123 <- $a ------- $b -> 123
234 <- $a ------- $b -> 234
345 <- $a ------- $b -> 345
声明:本文采用 BY-NC-SA 协议进行授权,如无注明均为原创,转载请注明转自一颗大萝北
本文地址:PHP将线性数据转为树形数据(无限级分类目录)
本文地址:PHP将线性数据转为树形数据(无限级分类目录)