Как убрать пустые массивы из массива в PHP

Раздел: Основы PHP -> Операции с массивами в 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, и они не будут затронуты.
  • Рекурсия удалит и те подмассивы, которые стали пустыми после очистки. Это желаемое поведение.
- Php конец массива (получить последний элемент массива в php)

Расширенные примеры удаления пустых массивов

Пример 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 )
)

Удалить пустые массивы из массива в PHP - comments

En
удалить пустые массивы php (php)