PHP经验分享

PHP实现无限级分类(递归+引用)

2019-03-25  本文已影响3人  孤城浪子55555

原始数据

递归

function getChild($data, $id = 0)
    {
        //初始化儿子
        $child = [];
        //循环所有数据找$id的儿子
        foreach ($data as $key => $datum) {
            //找到儿子了
            if ($datum['pid'] == $id) {
                //保存下来,然后继续找儿子的儿子
                $child[$datum['id']] = $datum;
                //先去掉自己,自己不可能是自己的儿孙
                unset($data[$key]);
                //递归找,并把找到的儿子放到一个child的字段中
                $child[$datum['id']]['child'] = $this->getChild($data, $datum['id']);
            }
        }
        return $child;
    }

运行结果:


递归运行结果

引用

    function test(){
        $a=1;
        $b=$a;  //赋值
        $b1=&$a;//赋址
        $a=2;
        dump('$b的值是:'.$b);
        dump('$b1的值是:'.$b1);
    }

最开始$a初始化为1,把$a的值(也就是1)赋给变量$b,然后把$a的地址(内存地址)赋给$b1,然后改变$a的值,再查看$b$b的值。结果如下:

传值和传址的区别
我们发现$b的值还是1,而$b1的值却跟随着$a的改变而改变了,这就是因为$b保存的是$a的地址,无论$a怎么变他们的值都会保持一致。
回到我们之前的问题上来,我们用新的数组保存了根节点的地址,后面无论根节点怎么变我们的新数组都会和变化过后的数据保持一致;那么不是根节点的数据怎么处理呢,我们这里可以把它的地址放到他爹的儿子节点当中,这样的话就是一层层引用,最后所有的数据都被新数组引用了。
说了这么多,代码如下:
function getChild($data)
    {
        $tree = [];
        $newData = [];
        //循环重新排列
        foreach ($data as $datum) {
            $newData[$datum['id']] = $datum;
        }
        foreach ($newData as $key => $datum) {
            if ($datum['pid'] > 0) {
                //不是根节点的将自己的地址放到父级的child节点
                $newData[$datum['pid']]['child'][] = &$newData[$key];
            } else {
                //根节点直接把地址放到新数组中
                $tree[] = &$newData[$datum['id']];
            }
        }
        return $tree;
    }

运行结果:


引用运行结果

参考文档

https://www.cnblogs.com/vishun/p/6716483.html

上一篇 下一篇

猜你喜欢

热点阅读