Avatar ·

Как удалить пустые элементы из массива в PHP?

Всем привет! Я новичок в PHP и столкнулся с проблемой при работе с массивами. У меня есть массив, который приходит из формы или из базы данных, и в нём часто встречаются пустые строки, null или false значения. Мне нужно удалить все такие "пустые" элементы, чтобы массив содержал только реальные данные. Вот пример моего кода: ```php $array = array("apple", "", "banana", null, "cherry", false, 0, " ", "date"); ``` После обработки я хочу получить: ``` Array ( [0] => apple [2] => banana [4] => cherry [7] => date ) ``` То есть должны быть удалены: - Пустые строки `""` - `null` - `false` - `0` (ноль) - Строки, состоящие только из пробелов `" "` Я пробовал использовать `array_filter()`, но он почему-то удаляет не всё, что нужно. Например, `0` остаётся. Также пробовал перебирать массив в цикле с `unset()`, но это ломает индексы. Подскажите, как правильно и эффективно решить эту задачу? Желательно с примерами кода. Заранее спасибо! <<>>

Решение с помощью array_filter() и callback-функции

Ваша проблема очень распространена, и PHP предоставляет элегантное решение — функцию array_filter(). По умолчанию она удаляет элементы, которые в логическом контексте эквивалентны false (пустая строка, null, false, 0, пустой массив). Однако " " (строка с пробелом) не считается пустой в логическом контексте, поэтому её нужно обрабатывать отдельно.

Основной способ: array_filter() без callback

<?php
$array = array("apple", "", "banana", null, "cherry", false, 0, " ", "date");

// Удаляет: "", null, false, 0
$filtered = array_filter($array);

print_r($filtered);
// Результат: Array ( [0] => apple [2] => banana [4] => cherry [7] => " " [8] => date )
// Пробел остался!
?>

Правильное решение: кастомная callback-функция

Чтобы удалить и строки, состоящие только из пробелов, используйте trim() внутри callback:

<?php
$array = array("apple", "", "banana", null, "cherry", false, 0, " ", "date");

$filtered = array_filter($array, function($value) {
    // trim() удаляет пробелы в начале и конце, после чего проверяем
    return !is_null($value) && trim($value) !== '';
});

// Важно: array_filter сохраняет ключи!
print_r($filtered);
// Array ( [0] => apple [2] => banana [4] => cherry [8] => date )
?>

Если нужно сбросить ключи (переиндексировать)

<?php
$filtered = array_values($filtered);
print_r($filtered);
// Array ( [0] => apple [1] => banana [2] => cherry [3] => date )
?>

Альтернативный вариант с array_diff()

Если вам нужно удалить только конкретные значения, можно использовать array_diff():

<?php
$array = array("apple", "", "banana", null, "cherry", false, 0, " ", "date");
$remove = array("", null, false, 0, " ");
$filtered = array_diff($array, $remove);
print_r($filtered);
// Результат: Array ( [0] => apple [2] => banana [4] => cherry [8] => date )
?>

Важные моменты

  • array_filter() сохраняет ключи — это может быть как плюсом (если важна связь), так и минусом (если нужны последовательные числовые индексы).
  • Производительность: для больших массивов (10k+ элементов) array_filter() работает быстро, но если вам нужно только удалить пустые строки — используйте встроенную функцию без callback.
  • Число 0: по умолчанию array_filter() удаляет 0, так как 0 == false. Если вам нужно сохранить ноль, измените callback: return $value !== '' && $value !== null && $value !== false;.
  • Строки с табуляцией: trim() также удаляет табуляцию, переводы строк и другие пробельные символы.

Рекомендация

Для большинства случаев используйте array_filter() с callback и trim(). Это универсальное и читаемое решение. Если вам нужно часто удалять пустые элементы, можно обернуть это в функцию:

<?php
function remove_empty_values($array) {
    return array_values(array_filter($array, function($value) {
        return !is_null($value) && trim($value) !== '';
    }));
}
?>
<<>>

Решение с помощью array_map() и array_filter() в связке

Если вам нужно не только удалить пустые элементы, но и предварительно обработать значения (например, обрезать пробелы), можно использовать комбинацию функций:

<?php
$array = array("apple", "", "banana", null, "cherry", false, 0, " ", "date");

// Сначала обрезаем пробелы у всех строк
$trimmed = array_map(function($value) {
    return is_string($value) ? trim($value) : $value;
}, $array);

// Затем фильтруем
$filtered = array_filter($trimmed, function($value) {
    return $value !== '' && $value !== null && $value !== false;
});

// Сбрасываем ключи
$result = array_values($filtered);

print_r($result);
// Array ( [0] => apple [1] => banana [2] => cherry [3] => date )
?>

Когда это полезно?

  • Если в массиве есть строки с пробелами в начале/конце, которые нужно очистить, а не удалять.
  • Если вы работаете с данными из CSV или форм, где часто встречаются лишние пробелы.
  • Если нужно сохранить оригинальные значения (например, числа), но удалить только пустые строки.

Важное замечание

Этот подход менее производительный, чем одиночный array_filter() с callback, так как проходит по массиву дважды. Для массивов до 1000 элементов разница незаметна, но для больших данных лучше использовать первый метод.

Также обратите внимание: если в массиве есть объекты или ресурсы, array_map() может вызвать ошибку при попытке применить trim() — в таком случае лучше добавить проверку типа.