函数
/**
* 将线性数据转为树形数据
*
* @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
更简洁的写法
/**
* 递归无限级分类权限
* @param array $data
* @param int $pid
* @param string $field1 父级字段
* @param string $field2 子级关联的父级字段
* @param string $field3 子级键值
* @return mixed
*/
function get_tree($data, $pid = 0, $field1 = ‘id’, $field2 = ‘pid’, $field3 = ‘children’)
{
$arr = [];
foreach ($data as $k => $v) {
if ($v[$field2] == $pid) {
$v[$field3] = get_tree($data, $v[$field1]);
$arr[] = $v;
}
}
return $arr;
}
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
一颗大萝北
本文地址: PHP将线性数据转为树形数据(无限级分类目录)
本文地址: PHP将线性数据转为树形数据(无限级分类目录)