我有一个路径列表(只是字符串),如下所示:
$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
对我来说没有孩子)我知道你会问我what have you tried?问题是: 我不知道如何以正确的方式解决问题
你可以给我一些建议,而不是大肆宣传吗?
答案 0 :(得分:2)
我非常接近,但不是结尾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
增加1并将$depth
更改为新的$current
来递归到路径$current[$key]
中的下一个元素第{{1}}节。
答案 1 :(得分:0)
您可以做的是迭代路径,爆炸每个路径的字符串,然后根据值的位置将每个值添加到新数组。如果该值是第一个,则它将成为基础。如果它是第二个,那么它将作为第一个内部的新数组进入,依此类推。