如何迭代PHP $ _FILES数组?

new*_*bie 4 php file-upload

这可能是一个愚蠢的问题,但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 
        ) 
    ) 
)
Run Code Online (Sandbox Code Playgroud)

And*_*ong 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
}
Run Code Online (Sandbox Code Playgroud)


Oko*_*000 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,
    );
}
Run Code Online (Sandbox Code Playgroud)

然后,您将拥有一个可以迭代的数组,并且其中的每个项目都将是一个结构的关联数组,该结构与普通的单个文件输入所具有的结构相同。因此,如果您已经具有处理这些功能的功能,则只需将每个项目传递给它,就不需要进行任何修改。

顺便说一句,将所有输入转换为数组的原因是,即使您忘记[]在文件输入的名称上输入,也可以使用该方法(当然,在这种情况下,您只会得到一个文件,但这总比打断它更好。 )。