doter1995 2013-03-22 09:03
浏览 82

从单维数组创建分层数组

I want to create a hierarchial array from the single dimensional array obtained from database. Language is PHP.

In the below mentioned example key id -3 indicates that it is the root node.

Input Data:

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
            }
}

Output expected data:

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
            )
        )
    )
)
  • 写回答

1条回答 默认 最新

  • doushi1974 2013-03-22 21:01
    关注
    $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 );
    

    The trick is to use &$a notation which gives us references instead of variable copies. Basically non-root nodes are attached to the parents, and root nodes go to result array.

    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c