美文网首页
PHP树结构的构建和反构建

PHP树结构的构建和反构建

作者: pengtoxen | 来源:发表于2018-08-02 16:20 被阅读0次

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

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

相关文章

  • PHP树结构的构建和反构建

    数据库取出来的数据,怎么格式化为树形结构呢? 打印出结构如下 现在如果要把这样的树形结构回退到之前的二维数据 打印...

  • 为你写诗

    诗歌的美名其曰 人生的美丽转身 写作的构建和谐 丰富的业余爱好 每个路口在反还

  • 好课堂的基本要素。

    基于问题的发现和解决,基于合作能力的培养和养成,基于课堂要素的构建和实施,强调发现问题,合作意识探究能力的培养,构...

  • 一步一步学用Tensorflow构建卷积神经网络

    摘要:本文主要和大家分享如何使用Tensorflow从头开始构建和训练卷积神经网络。这样就可以将这个知识作为一个构...

  • 2013IS-(NSW索引算法)Approximate near

    标题:基于可导航的小世界图的近似NN算法 编者的总结 设计了一个简易的KNN算法同时用于索引构建和查询。恰好如此构...

  • 用和谐奏响语文课堂的主旋律

    构建和谐课堂,不仅是实施素质教育,构建和谐教育需要,更是构建和谐校园、和谐社会,培养造就高素质一代新人的需要。因此...

  • Vue.js知识点

    独立构建和运行时构建 有两种构建方式,独立构建和运行构建。它们的区别在于前者包含模板编译器而后者不包含。 模板编译...

  • Effective Java 78 条极具实用价值的经验规则

    1.创建和销毁对象 第1条:考虑用静态工厂方法代替构造器 第2条: 构造器参数过多时考虑用构建器 第3条:用私有构...

  • 建造者模式

    1. 建造者模式? 建造者模式:将一个复杂对象的构建和它的表示分离, 使得同样的构建和创建出不同的表示.当我们构建...

  • 九师联盟12月创建文明城市下水作文

    题目: 作文: 外创“文明”,内提素质,构建和谐社会 最近,流行创建文明文明城市。对于这一做法,人们有不同的反...

网友评论

      本文标题:PHP树结构的构建和反构建

      本文链接:https://www.haomeiwen.com/subject/vjksvftx.html