注意:调用前,请确保,这是一个完整的树结构,不存在多个顶点top,或者 断层
/**
* 利用id+pid, 数组转换成树
* 调用前,请确保,这是一个完整的树结构,不存在多个顶点top,或者 断层
* @return void
* @date 2019-07-27 11:17:30
*/
function array_to_tree($array, $is_add_level = false)
{
if (empty($array)) return [];
// =================================================
// 将数组分层
// =================================================
$level = 1;
$last_pid = [min(array_column($array, 'pid'))];
$level_data = [];
while (count($array) > 0) {
// 当前层级的数据
$tmp_data = [];
// 剩余的数据
$rest_data = [];
foreach ($array as $value) {
if (in_array($value['pid'], $last_pid)) {
if ($is_add_level) $value['level'] = $level;
$tmp_data[$value['id']] = $value;
} else $rest_data[] = $value;
}
// 判断是否是树结构
if (empty($tmp_data)) throw new Exception('METHOD CALL ERR: THRER IS NO TREE');
$array = $rest_data;
$last_pid = array_column($tmp_data, 'id');
$level_data[$level++] = $tmp_data;
}
// =================================================
// 组成树结构
// =================================================
$max_level = max(array_keys($level_data));
$current_level = $max_level;
while ($current_level > 1) {
foreach ($level_data[$current_level] as $key => $value) {
$level_data[$current_level - 1][$value['pid']]['children'][] = $value;
}
unset($level_data[$current_level]);
$current_level--;
}
$tree = $level_data[1];
return $tree;
}