【问题标题】:$_FILES array and its silly structure [duplicate]$_FILES 数组及其愚蠢的结构
【发布时间】:2012-07-26 07:05:15
【问题描述】:

可能重复:
How do you loop through $_FILES array?

由于某种原因,数组真的很吸引我。我最终可以到达那里,但是这个 $_FILES 数组对我来说似乎是倒退的。

我希望能够像这样遍历 $_FILES:

foreach($_FILES as $file)
{
   echo $file['name'] . "<br>";
   echo $file['type'] . "<br>";
   echo $file['size'] . "<br>";
   echo $file['error'] . "<br>";
}

但显然,以它的结构方式,您无法做到这一点。所以我写了以下内容:

echo "<pre>";
                $x=0;
                $file = array();
                foreach($_FILES['attachment']['name'] as $data)
                {   $file[$x]=array(); 
                    array_push($file[$x],$data); $x++;
                }
                $x=0;
                foreach($_FILES['attachment']['type'] as $data)
                    {   array_push($file[$x],$data); $x++;}

                $x=0;
                foreach($_FILES['attachment']['tmp_name'] as $data)
                    {   array_push($file[$x],$data); $x++;}
                $x=0;
                foreach($_FILES['attachment']['error'] as $data)
                    {   array_push($file[$x],$data); $x++;}
                $x=0;
                foreach($_FILES['attachment']['size'] as $data)
                    {   array_push($file[$x],$data); $x++;}
                var_dump($file);
                echo "</pre>";

这似乎很冗长且荒谬,但我的想法目前停留在如何正确循环该数组的不同部分以使其工作并按照我想要的方式循环。

一定有更好的办法吗?

请帮忙!

【问题讨论】:

  • 当有人挣扎想学习时,我讨厌给他们答案。相反,我可以提供链接和资源来帮助他们更好地理解。以下两个链接提供了对您的问题的深入了解以及有关原因的一些解释。看看这个 StackOverflow 问题:stackoverflow.com/questions/5444827/… 我还建议阅读 PHP.Net 手册中的这条评论:php.net/manual/en/reserved.variables.files.php#106608
  • 您正在尝试遍历某个目录中的所有文件?
  • 郑重声明,$_FILES 是一个愚蠢的结构,它很好地说明了 PHP 的问题所在。它是多年来由许多人设计的语言,他们没有停下来,在做事之前先考虑一下。它正在慢慢变得更好,但在一些“已弃用”的东西真正开始及时被删除之前,情况永远不会真正改善。案例点:the following deprecated alias may be used: mysql_numrows() - 没错,一个弃用函数的弃用别名,在 5.4 中仍然可用。它很久以前就被弃用了,它甚至不在 PHP4 更新日志中。
  • $_FILES 数组结构很可能是 IETF MIME 传输如何通过 HTTP 工作的产物(可能还有一些 SAPI)。如果您发送多部分表单但未选择文件,则 $_FILES 数组仍会被填充! PHP 的执行周期高度依赖于 SAPI 和传入的数据流。解析 MIME 既不神奇也不漂亮。我希望看到你解析传入的 MIME 并告诉我你已经弄清楚了。二十多年来,Microsoft 一直在使用 Outlook 处理 MIME 内容,但仍然尚未完善它。 IETF MIME 是一团糟。责怪 IETF,而不是 PHP。
  • PHP 是一种开发人员倾向于不破坏现有用户空间软件的语言。一方面,我很感激不必浪费我的时间/精力每年从头开始重写我的软件,因为有人决定立即改变一切以满足最新的“最佳实践”时尚。如果现有的超全局让您如此困扰,那么请编写一个“修复”它的函数。 PHP 是开源软件:如果 PHP/Zend 引擎从未破解过 PHP 源代码并且不在 PHP 内部邮件列表中,那么任何人都没有任何权利抱怨 PHP/Zend 引擎。

标签: php file upload


【解决方案1】:

如果它们都具有相同的长度,您可以这样做

for($i = 0; $i < count($_FILES['attachment']['name']); $i++)
{
   echo $_FILES['attachment']['name'][$i] . "<br>";
   echo $_FILES['attachment']['type'][$i] . "<br>";
   echo $_FILES['attachment']['size'][$i] . "<br>";
   echo $_FILES['attachment']['error'][$i] . "<br>";

}

【讨论】:

    【解决方案2】:

    根据您的代码,我想您的 &lt;form&gt; 输入如下所示:

    <input type="file" name="attachment[]">
    <input type="file" name="attachment[]">
    

    如果您为文件字段提供唯一名称,您应该得到您想要的 $_FILES 结构:

    <input type="file" name="attachment0">
    <input type="file" name="attachment1">
    

    结果如下:

    数组(2){ '附件0' => 数组(5){ '名称' => 字符串(8)“1528.jpg” '类型' => 字符串(0)“” 'tmp_name' => 字符串(0)“” '错误' => int(2) '大小' => int(0) } '附件1' => 数组(5){ '名称' => 字符串(8)“1529.jpg” '类型' => 字符串(0)“” 'tmp_name' => 字符串(0)“” '错误' => int(2) '大小' => int(0) } }

    【讨论】:

    • 不,它只有一个带有multiple标签的输入。
    • 这将是一个很好的信息添加到问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2011-08-24
    • 2012-05-09
    相关资源
    最近更新 更多