我有一个包含完整文件路径的数组。 像这样:
[0] => "dir1/dir2/dir3/file.ext"
[1] => "dir1/dir2/dir3/file2.ext"
[2] => "dir1/dir2/dir3/file3.ext"
[3] => "dir2/dir4/dir5/file.ext"
我需要解析它并得到一个多维数组,如下所示:
[dir1] => [dir2] => [dir3] => file.ext
=> file2.ext
=> file3.ext
[dir2] => [dir4] => [dir5] => file.ext
有什么想法吗?必须使用不同深度的结构。
答案 0 :(得分:1)
我做完了你的作业! : - )
代码:
<?php
function parse_paths_of_files($array)
{
$result = array();
foreach ($array as $item)
{
$parts = explode('/', $item);
$current = &$result;
for ($i = 1, $max = count($parts); $i < $max; $i++)
{
if (!isset($current[$parts[$i-1]]))
{
$current[$parts[$i-1]] = array();
}
$current = &$current[$parts[$i-1]];
}
$current[] = $parts[$i];
}
return $result;
}
$test = array(
"dir1/dir2/dir3/file.ext",
"dir1/dir2/dir3/file2.ext",
"dir1/dir2/dir3/file3.ext",
"dir2/dir4/dir5/file.ext"
);
print_r(parse_paths_of_files($test));
?>
答案 1 :(得分:0)
以@J为基础。 Bruni的答案,您需要的代码如下:
function parse_paths_of_files($array)
{
rsort($array);
$result = array();
foreach ($array as $item) {
$parts = explode('/', $item);
$current = &$result;
for ($i = 1, $max = count($parts); $i < $max; $i++) {
if (!isset($current[$parts[$i - 1]])) {
$current[$parts[$i - 1]] = array();
}
$current = &$current[$parts[$i - 1]];
}
$last = end($parts);
if (!isset($current[$last]) && $last) {
// Don't add a folder name as an element if that folder has items
$current[] = end($parts);
}
}
return $result;
}
J Bruni的回答是狡猾的,因为它假定存在不存在的值,从而导致许多PHP未定义索引错误。
此版本还可以防止将文件夹名称添加到列表中,前提是该文件夹已包含以下条目:
$result = [
0 => folder_name
folder_name => [
...
]
]