【问题标题】:Create hierarchial array from single dimensional array从一维数组创建层次数组
【发布时间】:2013-03-22 09:03:49
【问题描述】:

我想从从数据库获得的一维数组创建一个层次数组。语言是PHP。

在下面提到的示例中,key id -3 表示它是根节点。

输入数据:

Array
(
    [-2] => Array
            (
                [data] => A-2
                [attr] => Array
                (
                    [id] => -2
                    [parent_id] => -3
                    [title] => A-2
                )
                [state] => open
            }
    [-1] => Array
            (
                [data] => A-1
                [attr] => Array
                (
                    [id] => -1
                    [parent_id] => -2
                    [title] => A-1
                )
                [state] => open
            }
    [0] => Array
            (
                [data] => A0
                [attr] => Array
                (
                    [id] => 0
                    [parent_id] => -1
                    [title] => A0
                )
                [state] => open
            }
    [1] => Array
            (
                [data] => A1
                [attr] => Array
                (
                    [id] => 1
                    [parent_id] => -1
                    [title] => A1
                )
                [state] => open
            }
    [2] => Array
            (
                [data] => A2
                [attr] => Array
                (
                    [id] => 2
                    [parent_id] => -1
                    [title] => A2
                )
                [state] => open
            }
    [3] => Array
            (
                [data] => A3
                [attr] => Array
                (
                    [id] => 3
                    [parent_id] => 2
                    [title] => A3
                )
                [state] => open
            }
    [4] => Array
            (
                [data] => A4
                [attr] => Array
                (
                    [id] => 4
                    [parent_id] => 2
                    [title] => A4
                )
                [state] => open
            }
    [5] => Array
            (
                [data] => A5
                [attr] => Array
                (
                    [id] => 5
                    [parent_id] => -2
                    [title] => A5
                )
                [state] => open
            }
}

输出预期数据:

Array
(
    [-2] => Array
    (
        [data] => A-2
        [attr] => Array
        (
            [id] => -2
            [parent_id] => -3
            [title] => A-2
        )
        [state] => open
        [children] => Array
        (
            [-1] => Array
            (
                [data] => A-1
                [attr] => Array
                (
                    [id] => -1
                    [parent_id] => -2
                    [title] => A-1
                )
                [state] => open
                [children] => Array
                (
                    [0] => Array
                    (
                        [data] => A0
                        [attr] => Array
                        (
                            [id] => 0
                            [parent_id] => -1
                            [title] => A0
                        )
                        [state] => open
                    }
                    [1] => Array
                    (
                        [data] => A1
                        [attr] => Array
                        (
                            [id] => 1
                            [parent_id] => -1
                            [title] => A1
                        )
                        [state] => open
                    }
                    [2] => Array
                    (
                        [data] => A2
                        [attr] => Array
                        (
                            [id] => 2
                            [parent_id] => -1
                            [title] => A2
                        )
                        [state] => open
                        [children] => Array
                        (
                            [3] => Array
                            (
                                [data] => A3
                                [attr] => Array
                                (
                                    [id] => 3
                                    [parent_id] => 2
                                    [title] => A3
                                )
                                [state] => open
                            }
                            [4] => Array
                            (
                                [data] => A4
                                [attr] => Array
                                (
                                    [id] => 4
                                    [parent_id] => 2
                                    [title] => A4
                                )
                                [state] => open
                            }
                        )
                    )
                )
            )
            [5] => Array
            (
                [data] => A5
                [attr] => Array
                (
                    [id] => 5
                    [parent_id] => -2
                    [title] => A5
                )
                [state] => open
            )
        )
    )
)

【问题讨论】:

    标签: php arrays recursion multidimensional-array jstree


    【解决方案1】:
    $a1 = array( ... your data is here ... );
    $a2 = array(); # there are root nodes
    $root_ids = array();
    
    foreach($a1 as &$a)
    {
        if( isset($a1[$a['attr']['parent_id']]) )
            $a1[$a['attr']['parent_id']]['children'][$a['attr']['id']] = &$a;
        else
            $a2[$a['attr']['id']] = &$a;
    }
    
    print_r( $a2 );
    

    诀窍是使用 &$a 表示法,它为我们提供引用而不是变量副本。基本上非根节点附加到父节点,根节点进入结果数组。

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2023-01-04
      • 2012-01-29
      • 2019-03-20
      相关资源
      最近更新 更多