使用节点值将平面数组转换为多维

时间:2016-08-04 17:48:33

标签: php arrays recursion multidimensional-array

我有一个看起来像这样的数组(更改为示例的食物 - 它实际上是商业主题标签的分类):

Array
(
    [fruit] => Fruit
    [fruit/apple] => Apple
    [fruit/banana] => Banana
    [fruit/passion-fruit] => Passion fruit
    [vegetable] => Vegetable
    [vegetable/beans] => Beans
    [vegetable/beans/runner-beans] => Runner beans        
)

我想使用递归(大概)将其改为:

Array
(
    [fruit] => Array
        (
            [title] => Fruit
            [children] => Array
                (
                    [apple] => Array
                        (
                            [title] => Apple
                        )
                    [banana] => Array
                        (
                            [title] => Banana
                        )
                    [passion-fruit] => Array
                        (
                            [title] => Passion fruit
                        )
                )
        )
    [vegetable] => Array
        (
            [title] => Vegetable
            [children] => Array
                (
                    [beans] => Array
                        (
                            [title] => Beans
                            [children] => Array
                                (
                                    [runner-beans] => Array
                                        (
                                            [title] => Runner beans
                                        )
                                )
                        )
                )
        )
)

我无法弄明白该怎么做。我在这里找到了其他的例子,用于将扁平化数组转换为多维数组但不存在值(“标题”)和自定义子节点。提前感谢任何指示。

1 个答案:

答案 0 :(得分:0)

假设您的数组名为$array

$result = array();

foreach($array as $key => $value) {
    $temp =& $result;
    $path = explode('/', $key);

    foreach($path as $subkey) {
        if(!isset( $temp[$subkey])) {
            $temp[$subkey]['title'] = $value;
            $temp[$subkey]['children'] = array();
        }
        $temp =& $temp[$subkey]['children'];
    }
}

即使没有孩子,即使创建了children密钥,我也会发布此信息。我将重新访问和编辑。