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

Pet*_*uza 1 html php 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实现背后的原因吗?

Ant*_*nna 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);
Run Code Online (Sandbox Code Playgroud)

如果运行它,则会得到以下结果.

[~]> 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
        )

)
Run Code Online (Sandbox Code Playgroud)

用$ _FILES代替$,你就完成了.作为额外的噱头,"重新映射"代码适用于具有与$ _FILES类似结构的所有数组