Удалить пустые элементы массива - PullRequest
713 голосов
/ 07 сентября 2010

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

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

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

Ответы [ 25 ]

1412 голосов
/ 07 сентября 2010

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

print_r(array_filter($linksArray));

Имейте в виду, что если обратный вызов не предоставлен , все записи массива, равные FALSE (см. преобразование в логическое значение ), будут удалены.Поэтому, если вам нужно сохранить элементы, которые являются точной строкой '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 !== ''; }));
156 голосов
/ 07 сентября 2010

Вы можете использовать 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);
104 голосов
/ 28 июня 2016

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

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

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

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

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

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

$arr = array_filter($arr, 'strlen');
96 голосов
/ 07 сентября 2010
$linksArray = array_filter($linksArray);

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

51 голосов
/ 22 апреля 2012
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
41 голосов
/ 26 ноября 2012

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

array_filter($array)

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

Другая опция делает

array_diff($array, array(''))

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

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

ОБНОВЛЕНИЕ

Вот пример.

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

Для суммированияup:

  • 0 или '0' удалит 0, а '0'
  • NULL, FALSE или '' удалит NULL, FALSE и ''
34 голосов
/ 07 сентября 2010
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
26 голосов
/ 28 февраля 2012

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

$array = array_filter($array, function($a) {return $a !== "";});

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


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

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});

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

16 голосов
/ 23 ноября 2017

Короче говоря:

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

$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

11 голосов
/ 10 декабря 2015

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

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

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

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

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

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

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

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

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...