问答

php递归里面使用静态变量保存数组,是不是不能生成树形结构的?

作者:admin 2021-07-18 我要评论

代码如下: $arr = array( array('id'=1,'name'='名称1','pid'=0,'cid'=2), array('id'=2,'name'='名称2','pid'=0), array('id'=3,'name'='名称3','pid'=0), arr...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

代码如下:

$arr = array(
            array('id'=>1,'name'=>'名称1','pid'=>0,'cid'=>2),
            array('id'=>2,'name'=>'名称2','pid'=>0),
            array('id'=>3,'name'=>'名称3','pid'=>0),
            array('id'=>4,'name'=>'名称4','pid'=>0),
            array('id'=>5,'name'=>'名称5','pid'=>0),
            array('id'=>6,'name'=>'名称1-1','pid'=>1),
            array('id'=>7,'name'=>'名称1-2','pid'=>1),
            array('id'=>8,'name'=>'名称2-1','pid'=>2),
            array('id'=>9,'name'=>'名称2-2','pid'=>2),
            array('id'=>10,'name'=>'名称3-1','pid'=>3),
            array('id'=>11,'name'=>'名称1-1-1','pid'=>6),
            array('id'=>12,'name'=>'名称1-1-2','pid'=>6),
            array('id'=>13,'name'=>'名称1-2-1','pid'=>7),
            array('id'=>14,'name'=>'名称2-1-1','pid'=>8),
            array('id'=>15,'name'=>'名称2-1-2','pid'=>8),
            array('id'=>16,'name'=>'名称2-2-1','pid'=>9),
            array('id'=>17,'name'=>'名称2-1-1-1','pid'=>14),
            array('id'=>18,'name'=>'名称2-1-2-1','pid'=>15),
            array('id'=>19,'name'=>'名称2-1-1-1-1','pid'=>17),
            array('id'=>20,'name'=>'名称3-1-1','pid'=>10),
        );
function getChildtree($data,$pid = 0,$level = 0){
        static  $result;
        foreach ($data as $key => $info){
            if($info['pid'] == $pid){
                $info['level'] = $level;
                $info['child'] = $info;
                $result[] = $info;
                unset($data[$key]);
                getChildtree($data,$info['id'],$level+1);
            }
        }
        return $result;
    }

调用:

    $childtree = $this->getChildtree($arr);
    print_r($childtree);

这样不能处理成树形结构的,用静态变量怎么处理成树形结构的?

###

不要使用静态变量来弄,这样的代码看着就像是刚刚学程序的人写的。思路应该是一层一层的。比如第一级$a[]=$one; 再使用引用的手段,把$one下面的赋值给他 $one[]=$two;这种应该你能很容易明白。当然 还可以使用其他手段。 这个算法其实也是有很多选择的,最差的O(n^2)复杂度。

###

按照楼主的思路稍微修改了下代码,定义一个类:

class Tree {
    
    private $_data = [];

    function __construct($data) {
        $this->_data = $data;
    }
    
    function child($pid, $level) {
        $child = [];
        foreach($this->_data as $v) {
            if($pid == $v['pid']) {
                $child[] = array_merge($v, [
                    'level' => $level,
                    'child' => $this->child($v['id'], $level + 1)
                ]);
            }
        }
        return $child;
    }
}

然后我们实例化Tree类,传入楼主的$arr,

$arr = array(
    array('id'=>1,'name'=>'名称1','pid'=>0,'cid'=>2),
    array('id'=>2,'name'=>'名称2','pid'=>0),
    array('id'=>3,'name'=>'名称3','pid'=>0),
    array('id'=>4,'name'=>'名称4','pid'=>0),
    array('id'=>5,'name'=>'名称5','pid'=>0),
    array('id'=>6,'name'=>'名称1-1','pid'=>1),
    array('id'=>7,'name'=>'名称1-2','pid'=>1),
    array('id'=>8,'name'=>'名称2-1','pid'=>2),
    array('id'=>9,'name'=>'名称2-2','pid'=>2),
    array('id'=>10,'name'=>'名称3-1','pid'=>3),
    array('id'=>11,'name'=>'名称1-1-1','pid'=>6),
    array('id'=>12,'name'=>'名称1-1-2','pid'=>6),
    array('id'=>13,'name'=>'名称1-2-1','pid'=>7),
    array('id'=>14,'name'=>'名称2-1-1','pid'=>8),
    array('id'=>15,'name'=>'名称2-1-2','pid'=>8),
    array('id'=>16,'name'=>'名称2-2-1','pid'=>9),
    array('id'=>17,'name'=>'名称2-1-1-1','pid'=>14),
    array('id'=>18,'name'=>'名称2-1-2-1','pid'=>15),
    array('id'=>19,'name'=>'名称2-1-1-1-1','pid'=>17),
    array('id'=>20,'name'=>'名称3-1-1','pid'=>10),
);

$Tree = new Tree($arr);
print_r($Tree->child(0, 0));

输出的打印结果:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 名称1
            [pid] => 0
            [cid] => 2
            [level] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [name] => 名称1-1
                            [pid] => 1
                            [level] => 1
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 11
                                            [name] => 名称1-1-1
                                            [pid] => 6
                                            [level] => 2
                                            [child] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [id] => 12
                                            [name] => 名称1-1-2
                                            [pid] => 6
                                            [level] => 2
                                            [child] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 7
                            [name] => 名称1-2
                            [pid] => 1
                            [level] => 1
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 13
                                            [name] => 名称1-2-1
                                            [pid] => 7
                                            [level] => 2
                                            [child] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 2
            [name] => 名称2
            [pid] => 0
            [level] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 8
                            [name] => 名称2-1
                            [pid] => 2
                            [level] => 1
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 14
                                            [name] => 名称2-1-1
                                            [pid] => 8
                                            [level] => 2
                                            [child] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 17
                                                            [name] => 名称2-1-1-1
                                                            [pid] => 14
                                                            [level] => 3
                                                            [child] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [id] => 19
                                                                            [name] => 名称2-1-1-1-1
                                                                            [pid] => 17
                                                                            [level] => 4
                                                                            [child] => Array
                                                                                (
                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [id] => 15
                                            [name] => 名称2-1-2
                                            [pid] => 8
                                            [level] => 2
                                            [child] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 18
                                                            [name] => 名称2-1-2-1
                                                            [pid] => 15
                                                            [level] => 3
                                                            [child] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 9
                            [name] => 名称2-2
                            [pid] => 2
                            [level] => 1
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 16
                                            [name] => 名称2-2-1
                                            [pid] => 9
                                            [level] => 2
                                            [child] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [id] => 3
            [name] => 名称3
            [pid] => 0
            [level] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 10
                            [name] => 名称3-1
                            [pid] => 3
                            [level] => 1
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 20
                                            [name] => 名称3-1-1
                                            [pid] => 10
                                            [level] => 2
                                            [child] => Array
                                                 (
                                                )

                                        )

                                )

                        )

                )

        )

    [3] => Array
        (
            [id] => 4
            [name] => 名称4
            [pid] => 0
            [level] => 0
            [child] => Array
                (
                )

        )

    [4] => Array
        (
            [id] => 5
            [name] => 名称5
            [pid] => 0
            [level] => 0
            [child] => Array
                (
                )

        )

)

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • php递归里面使用静态变量保存数组,是

    php递归里面使用静态变量保存数组,是

  • nginx 日志可以打印请求实际被转发的路

    nginx 日志可以打印请求实际被转发的路

  • 目前流行的浏览器,手机android/ios操

    目前流行的浏览器,手机android/ios操

  • C# winform BlockInput之后,为什么按任

    C# winform BlockInput之后,为什么按任

腾讯云代理商
海外云服务器