Удалить пустые элементы массива

Некоторые элементы в моем массиве - это пустые строки, основанные на том, что пользователь отправил. Мне нужно удалить эти элементы. У меня есть это:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

Но это не сработает, $linksArray все еще имеет пустые элементы. Я также пытался сделать это с помощью функции empty(), но результат тот же.

533
07 сент. '10 в 0:06
источник поделиться
24 ответов

Поскольку вы имеете дело с массивом строк, вы можете просто использовать array_filter(), который удобно обрабатывает все это для вас:

print_r(array_filter($linksArray));

Имейте в виду, что если обратный вызов не указан, все записи массива равны FALSE (см. преобразование в boolean) будет удалена. Поэтому, если вам нужно сохранить элементы, то есть точную строку '0', вам понадобится настраиваемый обратный вызов:

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));
1076
07 сент. '10 в 0:10
источник

Вы можете использовать array_filter для удаления пустых элементов:

$emptyRemoved = array_filter($linksArray);

Если у вас есть (int) 0 в вашем массиве, вы можете использовать следующее:

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

РЕДАКТИРОВАТЬ: Возможно, ваши элементы не пустые как таковые, но содержат одно или несколько пробелов... Вы можете использовать следующее, прежде чем использовать array_filter

$trimmedArray = array_map('trim', $linksArray);
134
07 сент. '10 в 0:14
источник
$linksArray = array_filter($linksArray);

"Если обратный вызов не передан, все записи ввода, равные FALSE, будут удалены." - http://php.net/manual/en/function.array-filter.php

72
07 сент. '10 в 0:14
источник
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
46
22 апр. '12 в 18:12
источник

Самый популярный ответ на эту тему абсолютно НЕПРАВИЛЬНЫЙ.

Рассмотрим следующий PHP script:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

Почему это? Поскольку строка, содержащая единственный символ "0", также вычисляет значение boolean false, поэтому, хотя это не пустая строка, она все равно будет отфильтрована. Это будет ошибкой.

Передача встроенной функции strlen, поскольку функция фильтрации будет работать, потому что она возвращает ненулевое целое для непустой строки и нулевое целое для пустой строки. Не нулевые целые числа всегда оценивают значение true при преобразовании в boolean, тогда как нулевые целые числа всегда вычисляются как false при преобразовании в boolean.

Итак, абсолютный, окончательный, правильный ответ:

$arr = array_filter($arr, 'strlen');
44
28 июня '16 в 19:30
источник

Вы можете просто сделать

array_filter($array)

array_filter: "Если обратный вызов не предоставляется, все записи ввода, равные FALSE, будут удалены". Это означает, что элементы со значениями NULL, 0, '0', '', FALSE, array() также будут удалены.

Другой вариант делает

array_diff($array, array(''))

который удалит элементы со значениями NULL, '' и FALSE.

Надеюсь, что это поможет:)

UPDATE

Вот пример.

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

Подводя итог:

  • 0 или '0' удалит 0 и '0'
  • NULL, FALSE или '' удалят NULL, FALSE и ''
36
26 нояб. '12 в 18:35
источник
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
24
07 сент. '10 в 0:10
источник

Еще один лайнер для удаления пустых ( "пустых строк" ) элементов из вашего массива.

$array = array_filter($array, create_function('$a','return $a!=="";'));

Примечание. Этот код преднамеренно содержит нулевые, 0 и ложные элементы.


Или, возможно, вы хотите сначала обрезать элементы массива:

$array = array_filter($array, create_function('$a','return trim($a)!=="";'));

Примечание. Этот код также удаляет нулевые и ложные элементы.

22
28 февр. '12 в 19:46
источник

Самый проголосовавший ответ ошибочен или, по крайней мере, не совсем прав, поскольку OP говорит только о пустых строках. Вот подробное объяснение:

Что означает пустое значение?

Прежде всего, мы должны договориться о том, какие пустые средства. Вы хотите отфильтровать:

  • пустые строки только ("")?
  • значения строго false. ($element === false)
  • значения falsey. (то есть 0, 0,0, "," 0", NULL, array()...)
  • эквивалент функции PHP empty()?

Как вы отфильтровываете значения

Чтобы отфильтровать только пустые строки:

$filtered = array_diff($originalArray, array(""));

Чтобы отфильтровать только значения строго false, вы должны использовать функцию обратного вызова:

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

Обратный вызов также полезен для любой комбинации, в которой вы хотите отфильтровать значения "falsey", кроме некоторых. (Например, фильтруйте каждый null и false и т.д., Оставив только 0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

Третий и четвертый случаи (для наших целей наконец) эквивалентны, и для этого все, что вам нужно использовать, - это значение по умолчанию:

$filtered = array_filter($originalArray);
9
10 дек. '15 в 16:36
источник
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)
7
23 окт. '13 в 0:14
источник

Если вы работаете с числовым массивом и вам нужно повторно проиндексировать массив после удаления пустых элементов, используйте array_values ​​:

array_values(array_filter($array));

Также смотрите: массив reindex PHP?

7
07 янв. '15 в 3:46
источник

Мне пришлось сделать это, чтобы сохранить значение массива (string) 0

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
7
06 нояб. '12 в 19:34
источник

Я использую следующий script для удаления пустых элементов из массива

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
7
10 нояб. '12 в 1:34
источник

Для многомерного массива

$data = array_map('array_filter', $data);
$data = array_filter($data);
6
29 апр. '14 в 13:46
источник
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
6
11 марта '14 в 17:57
источник

Просто хочу внести альтернативу циклам... также устраняя пробелы в ключах...

В моем случае я хотел сохранить последовательные ключи массива, когда операция была завершена (а не просто нечетные числа, на что я смотрел. Настройка кода для просмотра только для нечетных ключей казалась хрупкой для меня, а не для будущего.)

Я искал что-то вроде этого: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Комбинация array_filter и array_slice делает трюк.

$example = array_filter($example); $example = array_slice($example,0);

Отсутствует представление об эффективности или контрольных показателях, но оно работает.

5
23 нояб. '14 в 3:21
источник
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

Выход

1: 5

2: 6

4
11 марта '14 в 17:53
источник
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
4
02 февр. '13 в 12:13
источник

Только одна строка: Обновление (спасибо @suther):

$array_without_empty_values = array_filter($array);
4
03 февр. '14 в 21:20
источник

используйте array_filter функцию для удаления пустых значений:

$linksArray = array_filter($linksArray);
print_r($linksArray);
4
19 мая '13 в 14:45
источник
function trim_array($Array)
{
        foreach ($Array as $value)
                if (trim($value) == "")
                {
                        $index = array_search($value, $Array);
                        unset($Array[$index]);
                }
        return $Array;
}
4
17 окт. '12 в 18:58
источник

Удалить пустые элементы массива

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

¡он работает!

2
09 июля '14 в 13:45
источник

Короче:

Это мой предложенный код:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

Объяснение:

Я думаю, что использование array_filter является хорошим, но недостаточно, потому что значения будут похожими на space и \n,... сохранить в массиве, и это обычно плохо.

Поэтому я предлагаю вам использовать смесь array_filter и array_map.

array_map предназначен для обрезки, array_filter - для удаления пустых значений, strlen - для сохранения значения 0, а array_values - для индексации, если вам нужно.

Примеры:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

Результаты:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

Онлайн-тест:

http://phpio.net/s/5yg0

0
23 нояб. '17 в 0:59
источник

попробуйте это ** ** Пример

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );
0
11 марта '15 в 14:49
источник

Посмотрите другие вопросы по меткам или Задайте вопрос