Почему публикация формы дает $ _FILES ['thefile'] ['name'] [0] вместо $ _FILES ['thefile'] [0] ['name']? - PullRequest
1 голос
/ 21 декабря 2009

Когда вы называете несколько полей ввода файла с одинаковым именем и индексом массива, например:
<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 Ответ

5 голосов
/ 21 декабря 2009

Это было неудачное дизайнерское решение, и сейчас уже слишком поздно его менять, слишком много кода, который полагается на это точное поведение.

Однако ничто не мешает вам определить этот тип входных данных и переписать его в удобную для вас форму.

<?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
        )

)

Замените $ in на $ _FILES, и все готово. В качестве дополнительного трюка код «переназначения» работает для всех массивов с аналогичной структурой, как $ _FILES

...