Сброс пустых элементов массива - PullRequest
2 голосов
/ 24 августа 2011

Я работаю с $_FILES, и иногда массив содержит пустые элементы массива из-за пустых файловых вводов в моей форме.Я пытаюсь сбросить эти элементы.

Я пробовал следующие фрагменты кода:

foreach($_FILES['images']['name'] as $image)
{
    if(empty($image))
    {
        unset($image);
    }
}

foreach($_FILES['images']['name'] as $image)
{
    if($image == "")
    {
        unset($image);
    }
}

foreach($_FILES['images']['name'] as $image)
{
    if(!$image)
    {
        unset($image);
    }
}

Но массив всегда возвращается с пустыми элементами.Есть ли на самом деле разумный способ удаления пустых элементов массива $ _FILES с помощью PHP?

Ответы [ 5 ]

5 голосов
/ 24 августа 2011

Когда вы используете foreach($_FILES['images']['name'] as $image) оператор $ image становится копией фактического элемента в массиве, вы делаете сброс этой копии, вот как вы должны это сделать:

foreach( $_FILES['images']['name'] as $key => $value ) {
    if( empty($value) ) {
        unset( $_FILES['images']['name'][$key] );
    }
}
1 голос
/ 24 августа 2011

Начнем с того, что ваш вопрос не является конкретным, потому что если вы работаете с одним файлом, вам не нужен foreach (($ _FILES ['images'] ['name'] как $ image). Опять же, вы указали пустые поля в вашей форме, это должно привести к ошибке 4 случая. То есть файл не был загружен. так с методом ошибки ur, установленным как это

if($_FILES['upload']['error'] > 0){
echo 'the file couldnt be uploaded because';
 switch($_FILES['upload']['error']){
  case 1:
 print 'the file exceeds max size in php.ini';
 break;
 case 2:
  print 'the file exceeds max size in html settings';
 break;
  case 3:
 print 'the file was partially uploaded';
 break;
 case 4:
 print 'no file was uploaded';
 break;
 case 6:
 print 'no temporary folder available';
 break;
 case 7:
  print 'unable to write to disk';
 break;
 case 8:
print 'file upload stopped';
 break;
default:
print 'a sys error occured';
break;

При этом появляется уведомление об ошибке, и вы знаете, что пустое изображение было загружено. чтобы уберечь себя от стресса UNSET (). если это несколько загрузок, у вас будет что-то вроде

foreach ($_FILES['upload']['name'] as $number => $filename)
0 голосов
/ 17 апреля 2013

Как насчет этого не зацикленного ответа?

$in = $_FILES['images']['name'];
$out = array_filter($in);

Или, если вы предпочитаете одну строку:

$out = array_filter($_FILES['images']['name']);

со страницы руководства для array_filter:

"Если обратный вызов не предоставлен, все записи ввода, равные FALSE (см. Преобразование в логическое значение), будут удалены."

0 голосов
/ 24 августа 2011

с использованием кода ошибки будет лучше

foreach( $_FILES['images']['error'] as $key => $value ) {

    if($value==0) { 
      // file good do code
    } else { 
    unset( $_FILES['images']['name'][$key] );
    }

    }
0 голосов
/ 24 августа 2011

В дополнение к чьему-либо ответу, если вы также хотите убрать элемент из массивов type, tmp_name, size и т. Д., Используйте:

// Before stripping
print_r($_FILES);

$length = count($_FILES['images']['name']);
for($i = 0; $i < $length; $i++){
    if(empty($_FILES['images']['name'][$i]))
        foreach($_FILES['images'] as $key => $value)
        unset($_FILES['images'][$key][$i]);
}

// After stripping
print_r($_FILES);
...