具有多个字段时,$ _FILES数组的格式奇怪

时间:2011-01-27 15:26:34

标签: php file-upload html-form

我的表单中包含以下字段:

<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 个答案:

答案 0 :(得分:7)

这是完全正常的格式,它总是这样。如果你想要一个不同的结构,你可以在你的应用程序中进行转换,如下所示:

<?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]
    );
}

?>
祝你好运!

答案 1 :(得分:3)

您不需要,您可以轻松使用此结构:

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
}

答案 2 :(得分:0)

这是一个函数,它使用名称属性:

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;
}