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
)
旁注
- 结构仅显示,non-common部分
- 叶子会是
null
(null
对我来说没有 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]
.
您可以做的是遍历路径,展开每个路径的字符串,然后根据值的位置将每个值添加到新数组中。如果值是第一个,那么它将是基础。如果是第二个,那么它会作为一个新数组进入第一个数组,依此类推。
我有一个路径列表(只是字符串),如下所示:
$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
)
旁注
- 结构仅显示,non-common部分
- 叶子会是
null
(null
对我来说没有 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]
.
您可以做的是遍历路径,展开每个路径的字符串,然后根据值的位置将每个值添加到新数组中。如果值是第一个,那么它将是基础。如果是第二个,那么它会作为一个新数组进入第一个数组,依此类推。