PHP转换树结构中字符串的关联数组

PHP转换树结构中字符串的关联数组,php,tree,Php,Tree,我有一个路径列表(只是字符串),如下所示: $data = array( array('path' => 'foo/bar/baz'), array('path' => 'foo/bar/baz/qux'), array('path' => 'foo/bar'), array('path' => 'bar/baz/foo'), array('path' => 'baz'), ); 我希望实现这样的结构 Array (

我有一个路径列表(只是字符串),如下所示:

$data = array(
    array('path' => 'foo/bar/baz'),
    array('path' => 'foo/bar/baz/qux'),
    array('path' => 'foo/bar'),
    array('path' => 'bar/baz/foo'),
    array('path' => 'baz'),
);
我希望实现这样的结构

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => null
                        )
                )
        )
    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => null
                )
        )
    [baz] => null
)
旁注

  • 该结构仅显示非公共部分
  • 叶子将是
    null
    null
    对于我来说将没有孩子)
  • 我知道你会问我问题是: 我不知道如何正确处理这个问题


    你能不能给我一些建议,在不破坏否决票的情况下?

    我非常接近,但结尾不是
    null
    ,而是大小为0的数组

    <?php
    
    function ProcessPath($entry,$depth,&$current)
    {
      if($depth<count($entry))
      {
        $key = $entry[$depth];
        if(!isset($current[$key]))$current[$key] = null;
        ProcessPath($entry,$depth+1,$current[$key]);
      }
    }
    
    
    $data = array(
      array('path' => 'foo/bar/baz'),
      array('path' => 'foo/bar/baz/qux'),
      array('path' => 'foo/bar'),
      array('path' => 'bar/baz/foo'),
      array('path' => 'baz'),
    );
    $result = null;
    foreach($data as $path)
    {
      ProcessPath(explode("/",$path['path']),0,$result);
    }
    
    print_r($result);
    
    ?>
    
    基本上,ProcessPath的功能是:

    • 分割路径的数组
    • 当前深度,例如:
      [foo]
      (0)或
      foo>[bar]
      (1)或
      foo>bar>[baz]
      (2)
    • 对路径在数组中放置位置的引用(由
      和$reference表示)
    首先,该函数检查深度是否在当前正在处理的路径内

    然后提取
    $key
    ,以简化其余代码

    这就是神奇发生的地方,如果输出没有设置当前路径段,它就会设置它


    最后一行递归到路径
    $entry
    中的下一个元素,方法是采用相同的
    $entry
    ,将
    $depth
    增加1,并将
    $current
    更改为新的节
    $current[$key]

    您可以做的是迭代路径,分解每个路径的字符串,然后根据值的位置将每个值添加到新数组中。如果值是第一个,那么它将是基础。如果是第二个,那么它将作为第一个数组中的新数组,依此类推。

    我看不到数组后面的模式以及预期的输出。因为在您创建的最后:
    [baz]=>
    但是您已经有了一个以这个开头的。@Rizier123叶将是
    null
    null
    对于我来说将没有子项)您正在尝试将该数组按原样转换为所需的数组,对吗?如果这不起作用,只需更改
    []
    数组()
    (可能是语言错误)非常感谢。我编辑了答案以支持旧版本的php@SimoneNigro我刚刚添加了一个描述,所以它可能会清除您的编辑。我在晚上添加了
    array()s
    ,然后重新编辑(不知道你可以直接在那里敲打一个
    null
    )。现在应该给你想要的输出是完美的,它完全符合我的要求
    Array
    (
        [foo] => Array
            (
                [bar] => Array
                    (
                        [baz] => Array
                            (
                                [qux] => 
                            )
    
                    )
    
            )
    
        [bar] => Array
            (
                [baz] => Array
                    (
                        [foo] => 
                    )
    
            )
    
        [baz] => 
    )