PHP 二维数组转树形结构数组
PHP 二维数组转树形结构数组
该方法用于提供给前端多维筛选的数据,类似laravel框架的hasMany等方法。
/**
* @param $arr array 二维的数据数组
* @param $path array 数组转为树形结构的路径描述
* $path = ['A' => [['B', 'C'], ['D', 'E']], 'F' => [['G', 'H'], ['I', 'J']], 'K' => [['L', 'M']]];
* A:该结点以哪个值相同时进行合并
* A[n]:该节点的所需属性
* B:该属性在源数组中的key
* C:该属性在目标数组中的key
* D:同B
* E:同C
* F:同A
* @param $child_name string 结点子元素数组的key名称
* @param $jump_empty boolean 是否跳过值为空的元素
* @author gaoyuan
*/
function arrayToTree($arr, $path, $child_name = 'children', $jump_empty = true){
$result = [];
$path_count = count($path);
foreach ($arr as $key => $value) {
$item = &$result;
foreach($path as $num => $name){
if((!isset($value[$num]) || $value[$num] === null || $value[$num] == '') && $jump_empty){
continue; //值为空时跳过
}
foreach ($name as $item_name) {
$item[$value[$num]][$item_name[1]] = $value[$item_name[0]] ?? null; //赋值结点的值
}
$item = &$item[$value[$num]][$child_name]; //该结点的child引用下一级
}
}
$result = childToArray($result, $child_name); //去掉key和空child
return $result;
}
function childToArray($arr, $child_name, $level = 0){
foreach ($arr as $key => &$value) {
if($key === $child_name && !$value){
unset($arr[$key]); //去掉空child
}
if(is_array($value)){
if($key === $child_name){
$value = array_values($value); //去掉key
}
$value = childToArray($value, $child_name, $level + 1); //递归只下一级去掉key
}
}
if($level){
return $arr; //非最外层返回数组
}
return array_values($arr); //最外层返回去掉key的数组
}
PHP 二维数组转树形结构数组相关教程