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

533

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

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

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

  • 1
    Я подумал, что стоит упомянуть, что приведенный выше код не работает, потому что unset (...) работает с переменной, созданной циклом foreach, а не с исходным массивом, который, очевидно, остается таким, каким он был до цикла.
Теги:
string
arrays

24 ответа

1129
Лучший ответ

Поскольку вы имеете дело с массивом строк, вы можете просто использовать 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 !== ''; }));
  • 0
    Это была опечатка, ха-ха, извини. Это правильно в моем реальном коде. Спасибо за ответ :)
  • 2
    Я бы использовал empty над == '' . Но спасибо за ссылку :)
Показать ещё 11 комментариев
134

Вы можете использовать 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);
  • 8
    Я просто добавил его к принятому ответу BoltClock, вы можете просто сделать array_filter ($ foo, 'strlen'), чтобы избежать проблемы "0" и удалить только те, которые имеют нулевую длину.
  • 2
    @nezZario: при условии, что в вашем массиве есть только scalar элементы, да. В противном случае вы не можете сделать это.
Показать ещё 2 комментария
75
$linksArray = array_filter($linksArray);

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

  • 4
    Я также попробовал это после того, как Google столкнулся с проблемой. К сожалению, это оставляет в пустых элементах для меня.
  • 17
    это также удалит «0»
Показать ещё 1 комментарий
48
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
  • 0
    strlen также удаляет ложь :(
46

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

Рассмотрим следующий 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');
  • 1
    Согласовано. Это должен быть принятый ответ для тех, чей массив содержит строки
  • 2
    Большое спасибо за разъяснения
Показать ещё 4 комментария
36

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

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 и ''
  • 1
    Это лучший подход, чем создание функции и применение фильтра ...
25
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
  • 3
    Краткое, удобочитаемое и безопасное решение, которое не удаляет false и 0 . Учитывая, что это было опубликовано в ту же минуту, что и принятый ответ (это небезопасно и неверно), я могу только предположить, что ваши 8 голосов проголосовали по сравнению с принятым ответом 649, а последний - решение в одну строку.
  • 0
    @ rybo111 - возможно, хотя использование этой логики в array_filter() будет более подходящим, чем цикл foreach()
Показать ещё 1 комментарий
21

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

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

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


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

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

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

  • 0
    Проверьте страницу справочника: для этого не требуется обратный вызов.
  • 3
    Именно то, что мне нужно, и это также совместимо со старыми PHP , спасибо! ;-)
Показать ещё 2 комментария
9

Самый проголосовавший ответ ошибочен или, по крайней мере, не совсем прав, поскольку 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);
  • 2
    Если вы хотите , чтобы вынуть null и false , но оставить 0, вы можете также использовать PHP встроенный в strlen функции в качестве обратного вызова.
7

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

array_values(array_filter($array));

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

7
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)
  • 0
    мне нравится этот
7

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

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
7

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

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
6

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

$data = array_map('array_filter', $data);
$data = array_filter($data);
6
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
5

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

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

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

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

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

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

  • 0
    Я думаю, что array_values будет иметь тот же результат, что и array_slice. Это кажется более интуитивным с точки зрения чтения кода позже и понимания того, что он делает.
4
$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

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

$array_without_empty_values = array_filter($array);
  • 0
    вам не нужен ваш второй параметр: $ clean_array = array_filter ($ dirty_array);
4

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

$linksArray = array_filter($linksArray);
print_r($linksArray);
  • 0
    Он хочет удалить пустые строки , что не эквивалентно пустым значениям.
4
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
  • 0
    просто, прямо!
4
function trim_array($Array)
{
        foreach ($Array as $value)
                if (trim($value) == "")
                {
                        $index = array_search($value, $Array);
                        unset($Array[$index]);
                }
        return $Array;
}
2

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

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

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

0

Короче:

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

$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

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

$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
    );
  • 1
    что это? Есть множество других очень важных ответов. Что вы добавляете сюда?
  • 0
    посмотрите URL-адрес, что здесь за вопрос !! / * удалить пустой элемент массива * /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню