数据库取出来的数据,怎么格式化为树形结构呢?
//原始数据
$arr = [
[
'id' => 1,
'pid' => 0,
'title' => '父亲',
],
[
'id' => 2,
'pid' => 1,
'title' => '大儿子',
],
[
'id' => 3,
'pid' => 2,
'title' => '孙子',
],
[
'id' => 4,
'pid' => 0,
'title' => '叔叔',
],
[
'id' => 5,
'pid' => 0,
'title' => '伯伯',
],
[
'id' => 6,
'pid' => 1,
'title' => '小儿子',
],
[
'id' => 7,
'pid' => 5,
'title' => '堂哥',
],
];
//构建树形结构
function buildTree(array $elements, $parentId = 0, $exclude = [], $option = ['id', 'pid', 'children'])
{
$branch = array();
foreach ($elements as $element) {
if (in_array($element[$option[0]], $exclude)) {
continue;
}
if ($element[$option[1]] == $parentId) {
$element[$option[2]] = buildTree($elements, $element[$option[0]], $exclude);
$branch[] = $element;
}
}
return $branch;
}
echo '<pre/>';
$res = buildTree($arr, 0);
//$res = flattenTree($res);
print_r($res);
打印出结构如下
Array
(
[0] => Array
(
[id] => 1
[pid] => 0
[title] => 父亲
[children] => Array
(
[0] => Array
(
[id] => 2
[pid] => 1
[title] => 大儿子
[children] => Array
(
[0] => Array
(
[id] => 3
[pid] => 2
[title] => 孙子
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 6
[pid] => 1
[title] => 小儿子
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[pid] => 0
[title] => 叔叔
[children] => Array
(
)
)
[2] => Array
(
[id] => 5
[pid] => 0
[title] => 伯伯
[children] => Array
(
[0] => Array
(
[id] => 7
[pid] => 5
[title] => 堂哥
[children] => Array
(
)
)
)
)
)
现在如果要把这样的树形结构回退到之前的二维数据
function flattenTree($tree, $level = 0, $option = ['children', 'level'])
{
static $return = [];
foreach ($tree as $item) {
if ($item[$option[0]]) {
$l = $level;
$item[$option[1]] = $l;
flattenTree($item[$option[0]], ++$l);
unset($item[$option[0]]);
$return[] = $item;
} else {
$item[$option[1]] = $level;
unset($item[$option[0]]);
$return[] = $item;
}
}
return $return;
}
echo '<pre/>';
$res = flattenTree($res);
print_r($res);
打印结构如下
Array
(
[0] => Array
(
[id] => 3
[pid] => 2
[title] => 孙子
[level] => 2
)
[1] => Array
(
[id] => 2
[pid] => 1
[title] => 大儿子
[level] => 1
)
[2] => Array
(
[id] => 6
[pid] => 1
[title] => 小儿子
[level] => 1
)
[3] => Array
(
[id] => 1
[pid] => 0
[title] => 父亲
[level] => 0
)
[4] => Array
(
[id] => 4
[pid] => 0
[title] => 叔叔
[level] => 0
)
[5] => Array
(
[id] => 7
[pid] => 5
[title] => 堂哥
[level] => 1
)
[6] => Array
(
[id] => 5
[pid] => 0
[title] => 伯伯
[level] => 0
)
)
与原始数据格式一样,只是多了level字段