无级别递归调用,应用场景:菜单列表。如有父级,归属父级下,无归属父级。展示为父级
public function test() {
$dataList = [
['parent_id' => '0', 'id' => '1', 'title' => '父1'],
['parent_id' => '3', 'id' => '2', 'title' => '孙4-4'],
['parent_id' => '4', 'id' => '3', 'title' => '子4-3'],
['parent_id' => '0', 'id' => '4', 'title' => '父4'],
];
$new_level = [];
foreach ($dataList as $v) {
$tmp_level = $this->buildLevel($v, $new_level);
$new_level = $tmp_level['data'];
if (!empty($tmp_level['tmp'])) {
$new_level[] = $tmp_level['tmp'];
}
}
print_r($new_level);
}
public function buildLevel($target, $source) {
$target['children'] = [];
$rtn_data = [];
$source_data = $source;
$find = false;
$parent_key = 0;
$find_parent = false;
$find_child = false;
$children_data = [];
foreach ($source as $k => $v) {
if ($v['id'] == $target['parent_id']) {
$find_parent = true;
$find = true;
$parent_key = $k;
} else if ($v['parent_id'] == $target['id']) {
$target['children'][] = $v;
unset($source_data[$k]);
$find_child = true;
$find = true;
} else if (!empty($v['children'])) {
$tmp = $this->buildLevel($target, $v['children']);
$source_data[$k]['children'] = $tmp['data'];
if (empty($tmp['tmp'])) {
$find = true;
}
}
}
if ($find_parent) {
$source_data[$parent_key]['children'][] = $target;
} else if ($find_child) {
$source_data[] = $target;
}
$rtn_data['data'] = $source_data;
if (!$find) {
$rtn_data['tmp'] = $target;
}
return $rtn_data;
}
输出结果:
Array ( [0] => Array ( [parent_id] => 0 [id] => 1 [title] => 父1 [children] => Array ( ) ) [3] => Array ( [parent_id] => 0 [id] => 4 [title] => 父4 [children] => Array ( [0] => Array ( [parent_id] => 4 [id] => 3 [title] => 子4-3 [children] => Array ( [0] => Array ( [parent_id] => 3 [id] => 2 [title] => 孙4-4 [children] => Array ( ) ) ) ) ) ) )