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

Php 使用节点值将平面数组转换为多维数组,php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我有一个类似这样的数组(示例改为food——它实际上是业务主题标记的分类法): 我想使用递归(大概)将其更改为: Array ( [fruit] => Array ( [title] => Fruit [children] => Array ( [apple] => Array (

我有一个类似这样的数组(示例改为food——它实际上是业务主题标记的分类法):

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

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

我不知道怎么做。我在这里找到了其他将扁平数组转换为多维数组的示例,但在有值('Title')和自定义子节点的情况下没有。提前感谢您提供的所有指针。

假设您的数组名为
$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
键,但我还是发布了这篇文章。我将重新访问并编辑。

假设您的数组名为
$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
键,但我还是发布了这篇文章。我将重新访问并编辑。

谢谢-非常有用。当我看到它被写下来时,这很简单——“通过引用”传递现在完全有意义了。如果您能够删除空的子节点,那就更好了!出于兴趣,如果数组键不是'ID',而是像[0]=>array('ID'=>'orange','title'=>'orange',children=>…)这样的索引数组,那么这有多简单?我知道我们在键名上使用了isset(),因此它可能会导致在数组中搜索的复杂性。谢谢-非常有用。当我看到它被写下来时,这很简单——“通过引用”传递现在完全有意义了。如果您能够删除空的子节点,那就更好了!出于兴趣,如果数组键不是'ID',而是像[0]=>array('ID'=>'orange','title'=>'orange',children=>…)这样的索引数组,那么这有多简单?我知道我们在键名上使用了isset(),因此它可能会导致在数组中搜索的复杂性。