Как убрать пустые массивы из массива в PHP
Удаление пустых массивов из массива в PHP
Как удалить только пустые массивы, не затрагивая другие элементы?
Самое эффективное решение использует функцию array_filter с пользовательским обратным вызовом. Этот способ позволяет целенаправленно отфильтровать пустые массивы, оставляя все остальные значения (включая false, null, 0 и пустые строки) нетронутыми.
$array = [
'a' => [1, 2],
'b' => [],
'c' => null,
'd' => [],
'e' => 'text'
];
$filtered = array_filter($array, function($value) {
return !(is_array($value) && count($value) === 0);
});
print_r($filtered);
удалить пустые массивы php (удалить пустые массивы из массива в php)
Array
(
[a] => Array ( [0] => 1 [1] => 2 )
[c] => null
[e] => text
)
преобразовать массив в строку php (преобразовать массив в строку в php)
Возможные проблемы:
- Если в массиве есть ассоциативные ключи, array_filter сохраняет их (ключи не переиндексируются). Для числовых индексов ключи также сохраняются, но если нужно переиндексировать, можно применить array_values после фильтрации.
- Обратный вызов проверяет, является ли значение массивом и пусто ли оно. Условие count($value) === 0 работает только с массивами, поэтому предварительная проверка is_array обязательна – иначе для скалярных значений count выдаст ошибку.
- Альтернатива: empty($value) для массивов тоже вернёт true, но только если массив пуст. Однако empty(false) также true, поэтому если нужно сохранить false, используйте явную проверку is_array.
Как удалить пустые массивы вместе с другими «ложными» значениями?
Если в массиве содержатся только массивы (или вы готовы удалить все falsy-значения), можно использовать array_filter без обратного вызова. Функция по умолчанию удаляет все элементы, которые приводятся к false, в том числе пустые массивы.
$array = [
[1, 2],
[],
'0',
null,
[],
'строка'
];
$simple = array_filter($array);
print_r($simple);
посчитать массив php (посчитать элементы массива в php)
Array
(
[0] => Array ( [0] => 1 [1] => 2 )
[3] => '0'
[5] => 'строка'
)
Php сравнить массивы (сравнить массивы в php)
Типичная ошибка:
Пустая строка, 0 и false тоже будут удалены. Если нужно сохранить эти значения, такой способ не подходит. Кроме того, числовые ключи переиндексируются (сохраняются не подряд, как в примере: 0, 3, 5). Для преобразования в последовательные индексы используйте array_values.
Как вручную перебрать массив и удалить пустые вложенные массивы?
Классический цикл foreach даёт полный контроль. Можно удалять элементы по ссылке или копировать только нужные.
$array = [
'first' => [1,2],
'second' => [],
'third' => ['a'],
'fourth' => []
];
foreach ($array as $key => $value) {
if (is_array($value) && empty($value)) {
unset($array[$key]);
}
}
print_r($array);
Php отсортировать массив (отсортировать массив в php)
Array
(
[first] => Array ( [0] => 1 [1] => 2 )
[third] => Array ( [0] => 'a' )
)
Php разбить строку на массив (разбить строку на массив в php)
Проблема:
Если нужно переиндексировать числовые ключи после удаления, потребуется дополнительно вызвать array_values. Для ассоциативных массивов unset работает корректно.
Как удалить пустые массивы на всех уровнях вложенности (рекурсивно)?
Для многомерных массивов применяется рекурсивная функция. Она обходит все элементы и удаляет пустые подмассивы, в том числе те, которые стали пустыми после очистки их потомков.
function removeEmptyArraysRecursive(&$array) {
foreach ($array as $key => &$value) {
if (is_array($value)) {
removeEmptyArraysRecursive($value);
if (empty($value)) {
unset($array[$key]);
}
}
}
}
$data = [
'level1' => [
'a' => [],
'b' => [1,2],
'c' => []
],
'level2' => [],
'level3' => [
'inner' => []
]
];
removeEmptyArraysRecursive($data);
print_r($data);
Php массив добавление (добавить элемент в массив в php)
Array
(
[level1] => Array ( [b] => Array ( [0] => 1 [1] => 2 ) )
)
Ошибки при рекурсии:
- Изменение массива во время обхода (использование unset) может привести к пропуску элементов. В приведённом примере используется передача по ссылке (&$value), что безопасно, но нужно быть внимательным с внутренними указателями.
- Если в массиве есть объекты или ресурсы, is_array вернёт false, и они не будут затронуты.
- Рекурсия удалит и те подмассивы, которые стали пустыми после очистки. Это желаемое поведение.
Расширенные примеры удаления пустых массивов
Пример 1. Сохранение ключей при числовом индексировании
По умолчанию array_filter с callback оставляет ключи «как есть». Если нужны последовательные числовые индексы, применяется array_values.
$nums = [0 => [1], 1 => [], 2 => [2,3], 3 => []];
$filtered = array_filter($nums, fn($v) => !(is_array($v) && !$v));
$reindexed = array_values($filtered);
print_r($reindexed);
Array
(
[0] => Array ( [0] => 1 )
[1] => Array ( [0] => 2 [1] => 3 )
)
Пример 2. Использование стрелочной функции (PHP 7.4+)
Короткий синтаксис делает код компактнее.
$arr = [['x'], [], ['y'], []];
$result = array_filter($arr, fn($v) => !(is_array($v) && empty($v)));
print_r($result);
Array
(
[0] => Array ( [0] => 'x' )
[2] => Array ( [0] => 'y' )
)
Пример 3. Удаление пустых массивов из массива объектов
Если массив содержит объекты, is_array вернёт false, поэтому они будут сохранены. Это верно для всех решений.
$mixed = [
new stdClass(),
[],
[1],
null,
(object)['a' => 1],
[]
];
$cleaned = array_filter($mixed, function ($item) {
return !(is_array($item) && count($item) === 0);
});
print_r($cleaned);
Array
(
[0] => stdClass Object ( )
[2] => Array ( [0] => 1 )
[3] => null
[4] => stdClass Object ( [a] => 1 )
)
Пример 4. Рекурсивное удаление с сохранением ключей на всех уровнях
Функция возвращает новый массив, не изменяя исходный.
function cleanEmptyArrays(array $array): array {
foreach ($array as $key => $value) {
if (is_array($value)) {
$array[$key] = cleanEmptyArrays($value);
if (empty($array[$key])) {
unset($array[$key]);
}
}
}
return $array;
}
$nested = [
'a' => ['x' => [], 'y' => [1]],
'b' => [],
'c' => ['deep' => ['empty' => []]]
];
$result = cleanEmptyArrays($nested);
print_r($result);
Array
(
[a] => Array ( [y] => Array ( [0] => 1 ) )
)
Пример 5. Фильтрация с проверкой на count vs empty
Разница между count($v) === 0 и empty($v) для массивов отсутствует, однако empty($v) также срабатывает для несуществующих ключей. Для массивов всегда безопаснее count, если перед этим is_array.
$test = [0, 0.0, '0', null, false, []];
$res1 = array_filter($test, fn($v) => !(is_array($v) && count($v) === 0));
$res2 = array_filter($test, fn($v) => !(is_array($v) && empty($v)));
// $res1 и $res2 идентичны в данном случае, но empty не проверяет is_array
print_r($res1 === $res2 ? 'Совпадают' : 'Различаются');
Совпадают
Пример 6. Использование array_filter с ARRAY_FILTER_USE_BOTH
Если в обратном вызове нужен доступ к ключу, можно передать флаг.
$assoc = [
'keep' => ['data'],
'remove' => [],
'also_keep' => ['more'],
];
$filtered = array_filter($assoc, function($val, $key) {
return !(is_array($val) && empty($val));
}, ARRAY_FILTER_USE_BOTH);
print_r($filtered);
Array
(
[keep] => Array ( [0] => 'data' )
[also_keep] => Array ( [0] => 'more' )
)
Пример 7. Ошибка при использовании array_filter без callback с многомерным массивом
Пустые массивы удалятся, но вместе с любыми другими false-значениями. Если в массиве есть строка '0', она тоже исчезнет.
$problematic = [
['real'],
[],
'0',
[0],
false,
];
$result = array_filter($problematic);
print_r($result);
Array
(
[0] => Array ( [0] => 'real' )
[3] => Array ( [0] => 0 )
)