Weird формат массива $ _FILES при наличии нескольких полей

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

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

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

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

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

Удачи!

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

 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 } 

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

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