这可能是一个愚蠢的问题,但PHPs数组$ _FILES格式很奇怪,我以前从未使用过。有人能告诉我怎样才能以理智的方式迭代这个数组?我曾经习惯迭代对象或类似数组的对象,但这种格式对我来说非常奇怪。有没有办法像对象数组一样迭代这个数组?
( [attachments] =>
Array (
[name] => Array (
[0] => test1.png
[1] => test2.png
)
[type] => Array (
[0] => image/png
[1] => image/png
)
[tmp_name] => Array (
[0] => /tmp/phpmFkEUe
[1] => /tmp/phpbLtZRw
)
[error] => Array (
[0] => 0
[1] => 0
)
[size] => Array (
[0] => 9855
[1] => 3002
)
)
)
答案 0 :(得分:12)
<input type="file" name="attachments[]" />
吗?如果您能够使用唯一name=
进行更改,则不会有那种奇怪的格式......
要直接回答您的问题,请尝试:
$len = count($_FILES['attachments']['name']);
for($i = 0; $i < $len; $i++) {
$fileSize = $_FILES['attachments']['size'][$i];
// change size to whatever key you need - error, tmp_name etc
}
答案 1 :(得分:5)
我一直认为这种结构是胡说八道。因此,每当我使用多输入文件字段时,我都这样做:
$files = array_map('RemapFilesArray'
(array) $_FILES['attachments']['name'],
(array) $_FILES['attachments']['type'],
(array) $_FILES['attachments']['tmp_name'],
(array) $_FILES['attachments']['error'],
(array) $_FILES['attachments']['size']
);
function RemapFilesArray($name, $type, $tmp_name, $error, $size)
{
return array(
'name' => $name,
'type' => $type,
'tmp_name' => $tmp_name,
'error' => $error,
'size' => $size,
);
}
然后你将拥有一个可以迭代的数组,其中的每个项目都是一个与普通单个文件输入相同结构的关联数组。因此,如果您已经有一些处理它们的功能,您可以将这些项目传递给它,并且不需要任何修改。
顺便说一句,将所有输入转换为数组的原因是,即使您忘记将[]
放在文件输入的名称上,这也会有效(当然,您只能获得一个文件)那种情况,但它比破坏更好。
答案 2 :(得分:4)
最简单的方法是:
$files = $_FILES['attachments']['name'];
$count = 0;
foreach ($files as $file) {
$file_name = $file;
$file_type = $_FILES['attachments']['type'][$count];
$file_size = $_FILES['attachments']['size'][$count];
...
...
++$count;
}
答案 3 :(得分:3)
这是迭代$ _FILES的唯一方法。
foreach ($_FILES['attachments']['tmp_name'] as $k => $v) {
echo $_FILES['attachments']['name'][$k];
echo $_FILES['attachments']['type'][$k];
}
答案 4 :(得分:2)
foreach((array)$_FILES["attachments"] as $val) {
foreach((array)$val["name"] as $name) {
// $name = "test1.png",...
}
foreach((array)$val["type"] as $type) {
// $type = "imagepng",...
}
}
答案 5 :(得分:2)
在执行多部分表单时遇到了同样的问题。基本上我需要检查是否有任何文件首先使用'isset'上传,然后浏览每个文件并执行所有必要的条件。
最快的方法就是选择一个数组索引元素,比如['tmp_name']并使用foreach循环:
if(isset($_FILES['attachments']) {
foreach($_FILES['attachments']['tmp_name'] as $key => $value) {
//do stuff you need/like
}
}
使用数组进行多个文件上传的主要原因是,最终它更容易处理和迭代。如果使用附件1,附件2等唯一名称,则在更复杂的情况下会遇到许多问题。例如,我有其他上传字段用于不同的附件类别。
当然,如果你发现整个数组有问题,你可以像前面提到的那样将$_FILES
数组修复为更聪明的形式。
答案 6 :(得分:1)
我试过小型演示,看看
<html>
<body>
<form enctype="multipart/form-data" method="post">
<input type="file" name="file[]" />
<input type="file" name="file[]" />
<input type="submit" name="submit" />
</form>
<body>
</html>
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
foreach ($_FILES as $k=>$v){
if(is_array($v)){
foreach ($v as $sk=>$sv){
$arr[$sk][$k]=$sv;
}
}
}
echo "<pre>";
print_r($arr);
}
?>
输出
Array
(
[name] => Array
(
[file] => Array
(
[0] => 4_Milestone text (1).doc
[1] => 2x5 ko condolence ad.jpg
)
)
[type] => Array
(
[file] => Array
(
[0] => application/msword
[1] => image/jpeg
)
)
[tmp_name] => Array
(
[file] => Array
(
[0] => C:\xampp\tmp\php15EF.tmp
[1] => C:\xampp\tmp\php163E.tmp
)
)
[error] => Array
(
[file] => Array
(
[0] => 0
[1] => 0
)
)
[size] => Array
(
[file] => Array
(
[0] => 20480
[1] => 56642
)
)
)
答案 7 :(得分:0)
你走了: 下面的功能将帮助您以一种能够处理它的方式简化文件上传,类似于单个文件上传而不是多个文件上传。
HTML:(form.html)
<form method="post" action="post.php" enctype="multipart/form-data">
<input type="file" name="attachment[]" />
<input type="file" name="attachment[]" />
<input type="file" name="attachment[]" />
<input type="submit" value="Upload" />
PHP:(post.php)
<?php
function simplifyMultiFileArray($files = array())
{
$sFiles = array();
if(is_array($files) && count($files) > 0)
{
foreach($files as $key => $file)
{
foreach($file as $index => $attr)
{
$sFiles[$index][$key] = $attr;
}
}
}
return $sFiles;
}
$sFiles = simplifyMultiFileArray($_FILES['attachment']);
echo '<pre>';
print_r($sFiles);
?>
答案 8 :(得分:0)
有许多方法可以清理$ _FILES数组并使其更加合理。这是我的首选方式:
foreach ($_FILES as $fieldname => $keys)
{
foreach ($keys as $key => $list)
{
foreach ($list as $no => $value)
{
$files[$fieldname][$no][$key] = $value;
}
}
}