PHP树结构的构建和反构建

2018-08-02  本文已影响0人  pengtoxen

数据库取出来的数据,怎么格式化为树形结构呢?

//原始数据
$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字段

上一篇 下一篇

猜你喜欢

热点阅读