4

这可能是个愚蠢的问题,但是 PHP 数组 $_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 
        ) 
    ) 
)
4

9 回答 9

12

哇,这确实很奇怪,你<input type="file" name="attachments[]" />在标记中使用吗?如果你有能力改变那些使用 unique 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
}
于 2012-05-28T06:15:47.193 回答
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,
    );
}

然后,您将拥有一个可以迭代的数组,其中的每个项目都将是一个关联数组,其结构与您通过普通的单个文件输入获得的结构相同。所以,如果你已经有一些处理这些的函数,你可以将这些项目中的每一个传递给它,它不需要任何修改。

顺便说一句,将所有输入转换为数组的原因是,即使您忘记将[]文件输入的名称放在文件名上,它也能正常工作(当然,在这种情况下您只会得到一个文件,但这比破坏要好)。

于 2012-05-28T06:31:55.300 回答
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;
}
于 2012-05-28T06:15:48.667 回答
3

这是迭代 $_FILES 的唯一方法。

foreach ($_FILES['attachments']['tmp_name'] as $k => $v) {
  echo $_FILES['attachments']['name'][$k];
  echo $_FILES['attachments']['type'][$k];
}
于 2012-05-28T06:16:01.097 回答
2

这边走?

foreach((array)$_FILES["attachments"] as $val) {
   foreach((array)$val["name"] as $name) {
      // $name = "test1.png",...
   }
   foreach((array)$val["type"] as $type) {
      // $type = "imagepng",...
   }   
}
于 2012-05-28T06:19:29.753 回答
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当然,如果您发现整个数组有问题,您可以使用一种方法,如前所述,将数组修复为更巧妙的形式。

于 2012-11-08T14:48:10.847 回答
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
                )

        )

)
于 2012-05-28T06:22:47.303 回答
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);
?>
于 2012-05-28T06:33:49.833 回答
0

有很多方法可以清理 $_FILES 数组并使其更合理。这是我的首选方式:

foreach ($_FILES as $fieldname => $keys)
{
    foreach ($keys as $key => $list)
    {
        foreach ($list as $no => $value)
        {
            $files[$fieldname][$no][$key] = $value;
        }
    }
}
于 2014-05-03T15:47:23.140 回答