Определение отсутствия элементов в массиве 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] не пуста, так как содержит два элемента, хотя их значения «ложны».