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

PHP transform associative array of string in tree structure

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

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

旁注

  1. 结构仅显示,non-common部分
  2. 叶子会是 nullnull 对我来说没有 children)

我知道你会问我what have you tried?问题是: 不知道如何正确处理问题

你能给我一些建议吗?

我已经很接近了,但是结尾不是 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);

?>

产出

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => 
                        )

                )

        )

    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => 
                )

        )

    [baz] => 
)

ProcessPath 函数本质上采用:

  • 拆分路径数组
  • 当前深度例如:[foo](0)或foo > [bar](1)或foo > bar > [baz](2)
  • 对路径放置在数组中的位置的引用(由 &$reference
  • 表示

首先关闭函数检查深度是否在当前正在处理的路径内。

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

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

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

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