Определение отсутствия элементов в массиве PHP

Раздел: Основы PHP -> Работа с переменными и массивами

В PHP пустой массив - это массив, не содержащий ни одного элемента. Проверка на пустоту требуется во многих сценариях: перед выводом данных, при валидации форм, в циклах. Выбор способа зависит от конкретной задачи, наличия переменной и желаемой строгости.

Проверка пустоты массива в PHP

Наиболее распространённое и лаконичное решение - функция empty(). Она возвращает true для пустого массива, а также для необъявленной переменной, null, false, пустой строки, нуля. Это удобно для быстрой проверки без лишних предупреждений.

<?php
$arr = [];
var_dump(empty($arr)); // bool(true)
?>

Функция не требует предварительной инициализации переменной. Однако её недостаток в том, что она не отличает пустой массив от несуществующей переменной или null. Если нужно различать эти случаи, следует комбинировать с isset().

Проблема: empty() не сигнализирует о неопределённой переменной, что может скрыть ошибку в коде.

Решение: добавлять проверку на существование переменной через isset перед empty, если это критично.

Цель и случаи использования: когда требуется выяснить, есть ли в массиве хотя бы один элемент, и отсутствие переменной допустимо. Например, при получении данных из формы: если поле не было отправлено, empty() вернёт true, и можно вывести сообщение.

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

Функция count() возвращает количество элементов. Если это число равно 0, массив пуст.

<?php
$arr = ['apple'];
if (count($arr) === 0) {
    echo 'Массив пуст';
} else {
    echo 'Количество элементов: ' . count($arr);
}
?>

Проблема: если переменная $arr не определена, PHP выдаст предупреждение (Warning) и count вернёт 0 (или null в старых версиях).

Решение: предварительно проверить существование через isset или использовать empty().

Цель и случаи использования: когда нужно не только узнать пусто ли, но и получить количество элементов. Подходит для работы с гарантированно определёнными массивами.

Как строго сравнить массив с пустым?

Оператор === позволяет проверить, что переменная в точности равна пустому массиву.

<?php
$arr = [];
var_dump($arr === []); // bool(true)
?>

Проблема: если $arr не определена, возникнет notice, а само сравнение выдаст false.

Решение: применять только тогда, когда переменная точно существует.

Цель и случаи использования: когда важно отличить пустой массив от null, false или неопределённой переменной. Например, при разборе JSON, где поле может быть null или пустым массивом.

Как использовать логическое преобразование массива?

В логическом контексте пустой массив приводится к false, непустой - к true. Проверка !$arr возвращает true, если массив пуст.

<?php
$arr = [];
if (!$arr) {
    echo 'Массив пуст';
}
?>

Проблема: такой подход менее очевиден для других разработчиков и может быть спутан с проверкой на false. Также если $arr не определена, возникнет warning.

Решение: использовать только в коротких внутренних условиях или заменить на более читаемый вариант.

Цель и случаи использования: в минималистичном коде, где важна краткость, и переменная заведомо существует.

Как проверить, что массив не содержит непустых значений?

Функция array_filter() без callback удаляет все элементы, которые в логическом контексте равны false (пустые строки, null, 0, false). Если после фильтрации массив стал пустым, значит, все исходные элементы были «пустыми».

<?php
$arr = [0, '', null, false];
$filtered = array_filter($arr);
if (empty($filtered)) {
    echo 'Все элементы пусты';
}
?>

Проблема: array_filter трактует ноль и пустую строку как пустые, что может не совпадать с определением «пустого массива». Например, массив с одним нулевым элементом не является пустым, но после фильтрации станет пустым.

Решение: использовать для специфических задач, таких как проверка заполненности формы, где пустые поля не учитываются.

Цель и случаи использования: когда требуется проверить, что все элементы массива являются «ложными» значениями. Удобно для валидации наборов данных.

Как безопасно проверить пустой массив для неопределённой переменной?

Комбинация isset() и empty() позволяет сначала убедиться, что переменная существует, а затем проверить её на пустоту.

<?php
if (isset($arr) && empty($arr)) {
    echo 'Массив существует и пуст';
} elseif (!isset($arr)) {
    echo 'Переменная не определена';
}
?>

Проблема: код становится многословным. Кроме того, если $arr определена, но содержит не массив (например, строку), empty() тоже вернёт true, что может быть неверно.

Решение: для строгой проверки дополнить условием is_array($arr).

Цель и случаи использования: в скриптах, где переменная может быть не объявлена из-за отсутствия GET/POST параметров, и нужно избежать предупреждений.

Расширенные примеры проверки пустого массива

Ниже приведены подробные примеры, демонстрирующие различия между способами, а также нестандартные ситуации.

Пример 1. Сравнение empty(), count() и строгого равенства для разных типов

Пример
<?php
$cases = [
    'неопределённая' => $undefined, // notice, но мы подавим
    'null' => null,
    'пустой массив' => [],
    'массив с элементом' => ['a'],
];

foreach ($cases as $label => $value) {
    echo "Тест: $label\n";
    echo "  empty(): " . (empty($value) ? 'true' : 'false') . "\n";
    echo "  count()===0: " . (isset($value) && count($value) === 0 ? 'true' : 'false') . "\n";
    echo "  === []: " . ($value === [] ? 'true' : 'false') . "\n\n";
}
?>
Тест: неопределённая
  empty(): true
  count()===0: false (из-за isset вернуло false, так как переменная не определена)
  === []: false

Тест: null
  empty(): true
  count()===0: false (isset($value) вернуло false для null)
  === []: false

Тест: пустой массив
  empty(): true
  count()===0: true
  === []: true

Тест: массив с элементом
  empty(): false
  count()===0: false
  === []: false

Пояснение: empty() считает и неопределённую переменную, и null пустыми. count() с предварительным isset безопасен, но для null и неопределённой не пройдёт внутрь. Строгое сравнение работает только для реального пустого массива.

Пример 2. Использование array_filter для ассоциативного массива

Пример
<?php
$user = [
    'name' => 'Иван',
    'email' => '',
    'phone' => null,
    'age' => 0,
];

$notEmptyFields = array_filter($user);
if (empty($notEmptyFields)) {
    echo "Все поля пусты или не заполнены";
} else {
    echo "Заполнены поля: " . implode(', ', array_keys($notEmptyFields));
}
?>
Заполнены поля: name

Пояснение: array_filter убрал пустую строку, null и 0 (так как они приводятся к false), оставив только 'name'. Таким образом, пустота массива после фильтрации показывает, есть ли хотя бы одно «истинное» значение.

Пример 3. Комбинация is_array и count

Пример
<?php
function isArrayEmpty($var) {
    return is_array($var) && count($var) === 0;
}

$tests = [null, [], ['x'], 'string', 0];
foreach ($tests as $test) {
    var_dump(isArrayEmpty($test));
}
?>
bool(false)
bool(true)
bool(false)
bool(false)
bool(false)

Пояснение: функция проверяет, что переменная - массив, и при этом пустой. Это самый строгий способ, исключающий случайные типы.

Пример 4. Обработка неопределённой переменной с предупреждениями

Пример
<?php
error_reporting(E_ALL);

// Попытка использовать count без isset
$result = count($notDefined); // Warning: Undefined variable
var_dump($result); // int(0)

// Безопасный вариант
if (isset($notDefined) && empty($notDefined)) {
    echo "Переменная существует и пуста";
} else {
    echo "Переменная не определена или не пуста";
}
?>
Warning: Undefined variable $notDefined
int(0)
Переменная не определена или не пуста

Пояснение: прямое использование count() на неопределённой переменной вызывает предупреждение. Комбинация isset + empty работает без ошибок.

Пример 5. Проверка каждого элемента многомерного массива на пустоту

Пример
<?php
$matrix = [
    [1, 2],
    [],
    [0, null],
];

foreach ($matrix as $i => $row) {
    if (empty($row)) {
        echo "Строка $i пуста\n";
    } else {
        echo "Строка $i содержит элементы\n";
    }
}
?>
Строка 0 содержит элементы
Строка 1 пуста
Строка 2 содержит элементы (так как 0 и null не делают массив пустым в смысле empty)

Пояснение: empty() для подмассива проверяет его пустоту (отсутствие элементов). Строка с [0, null] не пуста, так как содержит два элемента, хотя их значения «ложны».

Проверка пустого массива - comments

En
Php пустой массив (php)