Странный формат массива $ _FILES при наличии нескольких полей - PullRequest
4 голосов
/ 27 января 2011

У меня есть форма, в которой есть такие поля:

<input type="file" name="images[]" />
<input type="file" name="images[]" />
<input type="file" name="images[]" />
<input type="file" name="images[]" />

Я ожидаю, что сделаю что-то вроде этого:

Array
(
    [images] => Array
        (
            [0] => Array
                (
                    [name] => test.jpg
                    [type] => image/jpeg
                    [tmp_name] => /tmp/nsl54Gs
                    [error] => 0
                    [size] => 1715
                )

            [1] => Array
                (
                    [name] => test.jpg
                    [type] => image/jpeg
                    [tmp_name] => /tmp/nsl54Gs
                    [error] => 0
                    [size] => 1715
                )

            [2] => Array
                (
                    [name] => test.jpg
                    [type] => image/jpeg
                    [tmp_name] => /tmp/nsl54Gs
                    [error] => 0
                    [size] => 1715
                )

            [3] => Array
                (
                    [name] => test.jpg
                    [type] => image/jpeg
                    [tmp_name] => /tmp/nsl54Gs
                    [error] => 0
                    [size] => 1715
                )
        )
)

Но я получаю что-то вроде этого:

Array
(
    [images] => Array
        (
            [name] => Array
                (
                    [0] => test.jpg
                    [1] => test.jpg
                    [2] => test.jpg
                    [3] => test.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                    [3] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/nsl54Gs
                    [1] => /tmp/nsl54Gs
                    [2] => /tmp/nsl54Gs
                    [3] => /tmp/nsl54Gs
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

            [size] => Array
                (
                    [0] => 1715
                    [1] => 1715
                    [2] => 1715
                    [3] => 1715
                )

        )

)

Как получить массив в ожидаемой форме?

Ответы [ 3 ]

7 голосов
/ 27 января 2011

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

<?php

$another_format = array();
for ($i=0; $i<count($_FILES['images']['name']); $i++){
    $another_format[$i] = array(
        'name' => $_FILES['images']['name'][$i],
        'type' => $_FILES['images']['type'][$i],
        'tmp_name' => $_FILES['images']['tmp_name'][$i],
        'error' => $_FILES['images']['error'][$i],
        'size' => $_FILES['images']['size'][$i]
    );
}

?>

Удачи!

3 голосов
/ 27 января 2011

Вам не нужно, вы можете легко работать с этой структурой:

foreach ($_FILES['images']['name'] as $key => $name) {
    $type = $_FILES['images']['type'][$key];
    $tmp_name = $_FILES['images']['tmp_name'][$key];
    $error = $_FILES['images']['error'][$key];
    $size = $_FILES['images']['size'][$key];

    // Do your stuff
}
0 голосов
/ 08 мая 2013

Вот функция, которая делает это и работает с атрибутами имени как:

name="artist[images][]"
name="images[]"
name="image"

Также работает с более чем одним полем файла:

<input type="file" name="artist[images][]" multiple>
<input type="file" name="artist[logos][]" multiple>

PHP:

function get_files( $array ) 
{
    $output = array();
    foreach ( $array as $base_key => $file ) {
        if ( is_array($file['name']) ) {
            $file_keys = array_keys( $file['name'] );
            foreach ( $file_keys as $file_key ) {
                if ( is_array( $file['name'][$file_key] ) ) {
                    $keys = array_keys( $file['name'][$file_key] );
                    foreach ( $keys as $key ) {
                        $output[$base_key][$file_key][$key] = array ( 
                            'name' => $file['name'][$file_key][$key], 
                            'type' => $file['type'][$file_key][$key], 
                            'tmp_name' => $file['tmp_name'][$file_key][$key], 
                            'error' => $file['error'][$file_key][$key], 
                            'size' => $file['size'][$file_key][$key] 
                        );
                    }
                } else $output[$base_key][$file_key] = array( 
                    'name' => $file['name'][$file_key], 
                    'type' => $file['type'][$file_key], 
                    'tmp_name' => $file['tmp_name'][$file_key], 
                    'error' => $file['error'][$file_key], 
                    'size' => $file['size'][$file_key] 
                    );

            }
        } else $output[$base_key] = $file;
    }
    return $output;
}
...