PHP多维数组表示文件路径

4

我有一个包含文件完整路径的数组。

[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

有任何想法吗?必须适用于不同深度的结构。


2
这个问题讨论的内容与你所需的几乎完全相同。链接 - Jon
2个回答

3

基于@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 => [
        ...
    ]
]

2
我已经完成了你的作业!:-)

http://ideone.com/UhEwd

代码:

<?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));

?>

你已经完成了他们的作业,但是你没有向提问者或研究人员解释你所做的和它是如何工作的。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接