为什么表单发布会产生$ _FILES ['thefile'] ['name'] [0]而不是$ _FILES ['thefile'] [0] ['name']?

时间:2009-12-21 15:04:20

标签: php html forms post cgi

当您命名多个具有相同名称和数组索引的文件输入字段时,如下所示:
<input type='file' name='thefile[0]'>
<input type='file' name='thefile[1]'>

然后在表格提交中你得到这个:
$_FILES['thefile']['name'][0]
$_FILES['thefile']['name'][1]
等等其他领域。

我觉得这很烦人,因为它可以防止重复使用代码进行非数组文件上传 这样做会不会更好:? $_FILES['thefile'][0]['name']等等?

有人知道这个奇怪的CGI / HTML实现背后的原因吗?

1 个答案:

答案 0 :(得分:5)

这是一个不幸的设计决定,现在改变它已经太晚了,那里有太多的代码依赖于这种确切的行为。

然而,没有什么能阻止您检测这种输入数据格式并将其重写为适合您的形式。

<?php
$in = array();
$in['name'] = array('name1', 'name2', 'name3');
$in['tmp_name'] = array('tmpname1', 'tmpname2', 'tmpname3');


$files = array();

// remap input data into desired format
foreach (array_keys($in) as $field) {
    foreach ($in[$field] as $index => $item) {
        $files[$index][$field] = $item;
    }
}

print_r($in);
print_r($files);

如果你运行它,你会得到以下结果。

[~]> php test.php
Array
(
    [name] => Array
        (
            [0] => name1
            [1] => name2
            [2] => name3
        )

    [tmp_name] => Array
        (
            [0] => tmpname1
            [1] => tmpname2
            [2] => tmpname3
        )

)
Array
(
    [0] => Array
        (
            [name] => name1
            [tmp_name] => tmpname1
        )

    [1] => Array
        (
            [name] => name2
            [tmp_name] => tmpname2
        )

    [2] => Array
        (
            [name] => name3
            [tmp_name] => tmpname3
        )

)

用$ _FILES替换$,你就完成了。作为额外的噱头,“重新映射”代码适用于所有与$ _FILES

类似结构的数组