【问题标题】:Explode path to create multidimensional array展开路径创建多维数组
【发布时间】:2015-03-15 16:29:20
【问题描述】:

我正在尝试从一个 zip 文件创建一个关联数组,其中文件夹是键,文件是最里面的值。

目前,当我在 zip 文件中的每个条目上打开 / 时,我会得到如下信息:

Array
(
    [0] => Folder1
    [1] => Folder2
    [2] => File1.txt
)
Array
(
    [0] => Folder1
    [1] => Folder2
    [2] => File2.txt
)
Array
(
    [0] => Folder1
    [1] => Folder3
    [2] => File3.txt
)

为了实现这一点,我正在这样做(在 $path 上执行 print_r):

if(in_array($content["ext"], array("zip"))){
    $zip       = zip_open($file);
    while($zip_entry = zip_read($zip)){
        $zip_path    = zip_entry_name($zip_entry);
        $path        = explode("/", $zip_path);
        $path        = array_filter($path);
        $lastElement = end($path);

        foreach($path as $key => $item){
            if($item != $lastElement){

            }
        }
    }
}

print_r($files);

我希望$files 包含一个多维数组,结果如下所示:

Array
(
    [Folder1] => Array
    (
        [Folder2] => Array
        (
            [0] => File1.txt
            [1] => File2.txt
        )
        [Folder3] => Array
        (
            [0] => File3.txt
        )
    )
)

在没有深度的情况下实现这一目标的最佳方法是什么?

【问题讨论】:

  • 请澄清“没有深度”
  • 没有深度,我的意思是无限数量的子数组。

标签: php arrays multidimensional-array path


【解决方案1】:
if (in_array($content["ext"], array("zip"))) {
    $zip = zip_open($file);

    $files = array();

    while ($zip_entry = zip_read($zip)) {
        $zip_path = zip_entry_name($zip_entry);
        $path = explode("/", $zip_path);
        $path = array_filter($path);
        $lastElement = end($path);

        //reset pointer
        $cur = &$files;

        $count = count($path);

        //set pointer to proper parent folder
        for ($i = 0; $i < $count - 1; $i++) {
            $cur = &$cur[$path[$i]];
        }

        //add file
        $cur[] = $path[$i];
    }

    //delete pointer
    unset($cur);
}

print_r($files);

【讨论】:

  • 在这条线上$cur[] = $path[$i]; 我得到Fatal error: [] operator not supported for strings
  • 您确定您复制的代码正确吗?我认为如果在 for 循环中您说 $cur = $path[$i]; 而不是 $cur = &amp;$cur[$path[$i]]; 或者您错过了 $files = array(); 行,您可能会收到该错误
  • 是的,我完全复制了它,唯一的区别是我的 $files 数组位于 if 语句上方。
  • 也许我的方法不对。基本上我正在做的是制作这样的可折叠树(在标题Package Contents下):assetstore.unity3d.com/en/#!/content/14147
【解决方案2】:

您也许可以分解 / 上的路径,然后使用 forloop 将所有部分放入另一个数组中。

然后你可以添加一个 if(...) 检查当前文件夹或文件是否已经在数组中。如果是这样,则继续,否则将其添加到数组中,然后继续

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2011-08-19
    • 2013-04-21
    相关资源
    最近更新 更多