【问题标题】:recursive function to transform multidimentional array用于转换多维数组的递归函数
【发布时间】:2014-10-13 13:31:03
【问题描述】:

在使用 cake PHP 进行 SQL 查询后,我有一个数组,它返回给我一棵树。我没有数组的维数。

我想将其转换为与 jstree 一起使用。我正在与递归函数作斗争,但没有成功。

你能帮帮我吗?

我原来的数组是这样的:

Array
(
[0] => Array
    (
        [Confsave] => Array
            (
                [id] => 815
                [Name] => 1
                [parent_id] =>
                [lft] => 1
                [rght] => 30
            )

        [children] => Array
            (
                [0] => Array
                    (
                        [Confsave] => Array
                            (
                                [id] => 816
                                [Name] => 2
                                [parent_id] => 815
                                [lft] => 2
                                [rght] => 15
                            )

                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [Confsave] => Array
                                            (
                                                [id] => 817
                                                [parent_id] => 816
                                                [lft] => 3
                                                [rght] => 8
                                            )

                                        [children] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [Confsave] => Array
                                                            (
                                                                [id] => 818
                                                                [Name] => 4
                                                                [parent_id] => 817
                                                                [lft] => 4
                                                                [rght] => 5
                                                            )

                                                        [children] => Array
                                                            (
                                                            )

                                                    )

                                                [1] => Array
                                                    (
                                                        [Confsave] => Array
                                                            (
                                                                [id] => 819
                                                                [Name] => 5
                                                                [parent_id] => 817
                                                                [lft] => 6
                                                                [rght] => 7
                                                            )

                                                        [children] => Array
                                                            (
                                                            )
                                                    )
                                            )
                                    )
                            )
                    )
            )
    )
)

我想要这样的东西:

Array
(
[0] => Array
    (
        [text] => 1
        [id] => 815
        [children] => Array
            (
                [0] => Array
                    (
                        [text] => 2
                        [id] => 816
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [text] => 3
                                        [id] => 817
                                        [children] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [text] => 4
                                                        [id] => 818
                                                    )
                                            )
                                    )
                                [1] => Array
                                    (
                                        [text] => 5
                                        [id] => 819
                                    )
                            )
                    )
            )
    )
)

我尝试过这样的递归函数,但没有成功

private function buildTree(array $elements) {

    $branch=array();
    foreach ($elements as $element){

        $branch[]=$element['Confsave']['Name'];
        if(is_array($element['children'])){
            $this->buildTree($element);
        }

    }
    return $branch;

}

编辑: 经过测试和评论后,我的功能现在是

private function buildTree(array $elements) {

    $branch=array();
    foreach ($elements as $element){

        $branch[]=$element['Confsave']['Name'];
        if(is_array($element['children'])){ 
            $this->buildTree($element['children']);
        }

    }
    return $branch;
}

当我调试时,我可以看到我为每个孩子(我想要的)去我的函数。但我不知道如何制作新的array()

【问题讨论】:

  • 我没看太久,但您没有在 if 语句中将 $branch[$curr_index]['children'] 分配给 $this->buildTree 的返回值。
  • 它有过两个孩子吗?
  • 是的,我可以有两个以上的孩子
  • 你能展示一个包含多个子元素的数组示例吗?
  • 您的输入与您的输出不匹配——请确保输出数组是输入数组的转换版本,而不仅仅是您编造的数据结构。

标签: php arrays recursion multidimensional-array


【解决方案1】:

这对我有用...

$array = buildTree($array); 

print_r($array); 

function buildTree(array $parent) { 
   $branch = array();  
   foreach ($parent as $index => $element){  
      $node = array();   
      $node['id']   = $element['Confsave']['id'];
      $node['text'] = isset($element['Confsave']['Name']) ?
                            $element['Confsave']['Name']  : 'no name';
      $node['children'] = buildTree($element['children']); 
      $branch[] = $node; 
   }
   return $branch; 
}

我的初始测试数组....

Array
(
    [0] => Array
        (
            [Confsave] => Array
                (
                    [id] => 999
                    [Name] => 999
                    [parent_id] => 
                    [lft] => 1
                    [rght] => 30
                )

            [children] => Array
                (
                    [0] => Array
                        (
                            [Confsave] => Array
                                (
                                    [id] => 777
                                    [Name] => 777
                                    [parent_id] => 999
                                    [lft] => 1
                                    [rght] => 30
                                )

                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [Confsave] => Array
                                (
                                    [id] => 888
                                    [Name] => 888
                                    [parent_id] => 999
                                    [lft] => 1
                                    [rght] => 30
                                )

                            [children] => Array
                                (
                                )

                        )

                )

        )

    [1] => Array
        (
            [Confsave] => Array
                (
                    [id] => 815
                    [Name] => 1
                    [parent_id] => 
                    [lft] => 1
                    [rght] => 30
                )

            [children] => Array
                (
                    [0] => Array
                        (
                            [Confsave] => Array
                                (
                                    [id] => 816
                                    [Name] => 2
                                    [parent_id] => 815
                                    [lft] => 2
                                    [rght] => 15
                                )

                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [Confsave] => Array
                                                (
                                                    [id] => 817
                                                    [parent_id] => 816
                                                    [lft] => 3
                                                    [rght] => 8
                                                )

                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [Confsave] => Array
                                                                (
                                                                    [id] => 818
                                                                    [Name] => 4
                                                                    [parent_id] => 817
                                                                    [lft] => 4
                                                                    [rght] => 5
                                                                )

                                                            [children] => Array
                                                                (
                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [Confsave] => Array
                                                                (
                                                                    [id] => 819
                                                                    [Name] => 5
                                                                    [parent_id] => 817
                                                                    [lft] => 6
                                                                    [rght] => 7
                                                                )

                                                            [children] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

我的结果数组....

Array
(
    [0] => Array
        (
            [id] => 999
            [text] => 999
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 777
                            [text] => 777
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 888
                            [text] => 888
                            [children] => Array
                                (
                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 815
            [text] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 816
                            [text] => 2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 817
                                            [text] => no name
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 818
                                                            [text] => 4
                                                            [children] => Array
                                                                (
                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [id] => 819
                                                            [text] => 5
                                                            [children] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2021-07-19
    • 2013-01-15
    • 2011-08-08
    • 1970-01-01
    • 2012-06-12
    • 2015-05-30
    • 2015-11-11
    • 2017-12-28
    相关资源
    最近更新 更多