Определение массива: методы и примеры
Проверка на массив в PHP
Наиболее эффективным и прямым способом проверки, является ли переменная массивом, служит встроенная функция is_array(). Она возвращает true, если переданная переменная представляет собой массив, и false в противном случае. Этот метод работает с любой версией PHP и не требует дополнительных расширений.
$data = ['apple', 'banana', 'cherry'];
if (is_array($data)) {
echo 'Переменная является массивом.';
} else {
echo 'Переменная не является массивом.';
}Php проверка на массив (проверка, является ли переменная массивом в php)
Переменная является массивом.
Функция корректно обрабатывает как обычные массивы, так и ассоциативные, а также пустые массивы. Для объекта класса ArrayObject или другого итерируемого объекта is_array() вернёт false, поскольку это не массив, а объект.
Как проверить, является ли переменная массивом, используя gettype()?
Функция gettype() возвращает строку с названием типа переменной. Для массива - 'array'. Этот способ менее производителен, чем is_array(), но может быть полезен, когда требуется не только проверка на массив, но и определение других типов.
$value = [1, 2, 3];
$type = gettype($value);
if ($type === 'array') {
echo 'Это массив.';
}
Это массив.
Проблема: gettype() возвращает строку, которую легко опечататься в сравнении. К тому же для неопределённой переменной gettype() вызовет ошибку уровня E_WARNING (до PHP 8.0) или выбросит TypeError (начиная с PHP 8.0). Рекомендуется сначала проверять существование переменной через isset().
Как проверить, является ли переменная массивом или итерируемым объектом?
Если нужно убедиться, что переменную можно перебирать в цикле foreach, используется функция is_iterable() (доступна с PHP 7.1). Она возвращает true как для массивов, так и для объектов, реализующих Traversable (например ArrayObject, Iterator).
$array = ['a' => 1, 'b' => 2];
$object = new ArrayObject($array);
echo is_iterable($array) ? 'Массив итерируем' : 'Нет';
echo "\n";
echo is_iterable($object) ? 'Объект итерируем' : 'Нет';
Массив итерируем Объект итерируем
Ограничение: is_iterable() не различает массив и объект. Если требуется строгая проверка именно на массив, этот метод не подходит.
Как проверить, является ли массив индексированным (списком)?
Начиная с PHP 8.1 существует функция array_is_list(), которая определяет, является ли массив списком - то есть имеет последовательные целочисленные ключи от 0 до count($array)-1. Это дополнительная проверка после is_array().
$list = ['zero', 'one', 'two'];
$assoc = ['name' => 'John', 'age' => 30];
echo array_is_list($list) ? 'list - Да' : 'list - Нет';
echo "\n";
echo array_is_list($assoc) ? 'assoc - Да' : 'assoc - Нет';
list - Да assoc - Нет
Совместимость: array_is_list() недоступна в версиях PHP ниже 8.1. Для старых версий можно написать собственную проверку:
function isList(array $arr): bool {
$i = 0;
foreach ($arr as $key => $value) {
if ($key !== $i++) return false;
}
return true;
}
Как избежать ошибки при проверке неопределённой переменной?
Перед вызовом is_array() или gettype() стоит убедиться, что переменная определена, с помощью isset() или оператора ?? (null coalescing).
// Без проверки может вызвать WARNING (или TypeError в PHP 8+)
$undefined = $maybeArray ?? [];
if (is_array($undefined)) {
echo 'Массив (возможно пустой)';
}
// Или более строго:
if (isset($maybeArray) && is_array($maybeArray)) {
echo 'Переменная существует и является массивом';
}
(вывод зависит от наличия переменной)
Расширенные примеры проверки на массив
Рекурсивная проверка элементов (массив массивов)
Иногда требуется убедиться, что все элементы переменной являются массивами. Это может понадобиться при работе с многомерными структурами.
function allAreArrays($data): bool {
if (!is_array($data)) {
return false;
}
foreach ($data as $item) {
if (!is_array($item)) {
return false;
}
}
return true;
}
$valid = [[1,2], [3,4], [5,6]];
$invalid = [[1,2], 'string', [5,6]];
echo allAreArrays($valid) ? 'Все массивы' : 'Есть не массив';
echo "\n";
echo allAreArrays($invalid) ? 'Все массивы' : 'Есть не массив';
Все массивы Есть не массив
Проверка с приведением типа через (array)
Оператор приведения (array) преобразует скалярные значения в массив. Это не проверка, а способ гарантировать, что дальше используется массив. Однако после приведения можно применить is_array() - результат всегда будет true.
$value = 'text';
$array = (array) $value;
var_dump($array);
echo is_array($array) ? 'Стал массивом' : 'Ошибка';
array(1) {
[0] =>
string(4) "text"
}
Стал массивом
Использование array_walk для проверки массива
Функция array_walk() применяет callback к каждому элементу массива. Её можно применить только к массиву, поэтому предварительная проверка обязательна. Пример демонстрирует, как проверить, что все значения являются целыми числами.
$data = [10, 20, 30];
if (is_array($data)) {
$allInt = true;
array_walk($data, function($val) use (&$allInt) {
if (!is_int($val)) {
$allInt = false;
}
});
echo $allInt ? 'Все целые' : 'Есть не целые';
} else {
echo 'Не массив';
}
Все целые
Функция is_array с динамическими переменными
Переменная может быть получена из внешнего источника (JSON, POST, GET). Перед обработкой стоит проверять её тип.
$input = json_decode('[{"id":1},{"id":2}]', true);
if (is_array($input)) {
foreach ($input as $item) {
echo $item['id'] . ' ';
}
} else {
echo 'Ожидался массив JSON';
}
1 2
Проверка с помощью оператора match (PHP 8.0+)
Оператор match позволяет компактно обрабатывать разные типы, включая массивы.
$var = ['red', 'green'];
$result = match (true) {
is_array($var) => 'Это массив',
is_string($var) => 'Строка',
default => 'Другой тип'
};
echo $result;
Это массив
Проверка на ассоциативный массив (самописная функция для старых PHP)
Если требуется отличить ассоциативный массив от индексированного, а array_is_list() недоступен, можно создать собственную реализацию.
function isAssoc(array $arr): bool {
if (empty($arr)) {
return false; // пустой массив - не ассоциативный
}
return array_keys($arr) !== range(0, count($arr) - 1);
}
$list = [10, 20];
$assoc = ['a' => 1, 'b' => 2];
echo isAssoc($list) ? 'Ассоциативный' : 'Индексированный';
echo "\n";
echo isAssoc($assoc) ? 'Ассоциативный' : 'Индексированный';
Индексированный Ассоциативный