Как удалить пустые элементы из массива в PHP?
Решение с помощью 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() — в таком случае лучше добавить проверку типа.