【问题标题】:PHP multidimensional array representing filepath表示文件路径的 PHP 多维数组
【发布时间】:2012-09-09 00:39:06
【问题描述】:

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

[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

有什么想法吗?必须适用于各种深度的结构。

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案1】:

以@J 为基础。布鲁尼的回答,你需要的代码如下:

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

    【讨论】:

    • 你已经完成了他们的作业,但你没有向 OP 或研究人员解释你做了什么以及它是如何工作的。
    猜你喜欢
    • 2017-02-06
    • 2015-01-19
    • 1970-01-01
    • 2018-08-26
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多