Способы определения массива в PHP: от is_array до gettype
Проверка переменной на принадлежность к массиву в PHP
Основной и самый эффективный способ: функция is_array()
Для определения, является ли переменная массивом, в PHP существует встроенная функция is_array(). Она принимает один аргумент и возвращает true, если переданная переменная является массивом, и false в противном случае. Это стандартная и наиболее надёжная проверка, не зависящая от внутреннего представления типа.
$var = [1, 2, 3];
$result = is_array($var); // trueФункция работает корректно как с индексированными, так и с ассоциативными массивами. Она не требует дополнительного анализа структуры данных и выполняется быстро.
Как узнать, является ли переменная массивом с помощью оператора instanceof?
Можно использовать оператор instanceof для проверки принадлежности к типу Array. Однако в PHP нет встроенного класса Array, поэтому $var instanceof Array всегда будет false, если только переменная не является экземпляром класса, явно наследующего от Array (что в стандартной библиотеке не встречается). Этот способ неприменим для стандартных массивов и может ввести в заблуждение.
$arr = [1, 2];
$check = $arr instanceof Array; // falseПроблема: оператор instanceof не предназначен для проверки примитивных типов PHP. Использование его для определения массива не имеет смысла и всегда возвращает ложный результат. Решение: использовать is_array().
Как проверить тип переменной функцией gettype()?
Функция gettype() возвращает строковое представление типа. Для массива она вернёт строку 'array'. Сравнение результата со строкой 'array' также является допустимым способом проверки.
$var = ['key' => 'value'];
if (gettype($var) === 'array') {
echo 'Это массив';
}Проблема: gettype() возвращает строку, и сравнение строк менее эффективно, чем is_array(), но не критично. Однако эта функция может возвращать 'object' для объектов, что правильно разделяет типы. Главный недостаток - дополнительное приведение типов не происходит, так что результат всегда корректен. Решение: если проект требует единообразного стиля, можно использовать gettype(), но рекомендуется отдавать предпочтение is_array().
Как сравнить переменную с приведённым к массиву значением?
Некоторые разработчики используют приведение типа через (array) и затем сравнение с исходной переменной с помощью строгого сравнения ===. Если переменная является массивом, приведение не изменит её, и сравнение вернёт true. Однако для не-массивов (например, для чисел) приведение создаст новый массив с одним элементом, и исходная переменная не будет равна ему, поэтому результат будет false. Этот метод не гарантирует правильности, так как для объекта, реализующего ArrayAccess, приведение может дать массив со свойствами, но исходная переменная останется объектом, и сравнение вернёт false.
$var = 42;
$casted = (array) $var;
$isArray = ($var === $casted); // false, $var не равен массиву [42]$arr = ['a', 'b'];
$isArray = ($arr === (array) $arr); // trueПроблема: метод ненадёжен для объектов и ресурсов, а также может ввести в заблуждение при проверке нулевого значения (null приведётся к пустому массиву, но null !== []). Решение: не использовать приведение типа для проверки, применять is_array().
Как проверить, является ли переменная массивом, с помощью array_key_first() и count()?
Иногда пытаются использовать функции, работающие с массивами, например count() или array_key_first(), для косвенной проверки. Если переменная не массив, эти функции могут вызвать предупреждение (в PHP 8.0+ count() вызовет TypeError для не-счётных типов, если не передать флаг COUNT_NORMAL).
$var = 'text';
// $count = count($var); // TypeError: count(): Argument #1 ($value) must be of type Countable|array, string givenПроблема: такой подход не проверяет тип, а пытается использовать переменную как массив. При несоответствии типов возникают ошибки. Решение: всегда сначала применять is_array(), а затем уже работать с массивными функциями.
Расширенные примеры проверки массива в PHP
Пример 1. Проверка различных типов данных с помощью is_array()
$values = [
[1, 2, 3],
'not array',
123,
null,
new stdClass(),
['a' => 1, 'b' => 2],
function() { return []; },
];
foreach ($values as $v) {
echo is_array($v) ? 'true' : 'false';
echo ' - ' . get_debug_type($v) . "\n";
}true - array false - string false - int false - null false - object true - array false - object (Closure)
Функция is_array() правильно определяет только массивы, не путая их с объектами или другими типами.
Пример 2. Проверка с использованием gettype() и сравнение производительности
$var = range(1, 1000);
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$res = is_array($var);
}
$end = microtime(true);
echo 'is_array: ' . ($end - $start) . ' сек.\n';
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$res = gettype($var) === 'array';
}
$end = microtime(true);
echo 'gettype: ' . ($end - $start) . ' сек.\n';is_array: 0.0062 сек. gettype: 0.0098 сек.
Хотя разница незначительна, is_array() немного быстрее и семантически правильнее.
Пример 3. Обработка объектов, реализующих ArrayAccess (например, ArrayObject)
$obj = new ArrayObject(['x', 'y', 'z']);
echo is_array($obj) ? 'массив' : 'не массив'; // не массив
// Однако можно проверить, является ли переменная итерируемой или реализует ArrayAccess:
echo ($obj instanceof ArrayAccess) ? 'implements ArrayAccess' : 'no';не массив implements ArrayAccess
Важно помнить: ArrayObject - это объект, а не массив. Функция is_array() корректно возвращает false. Если код должен работать и с объектами, поддерживающими доступ по ключу, следует проверять наличие интерфейса ArrayAccess или Traversable.
Пример 4. Использование функции is_array() в комбинации с фильтрацией ввода данных
function validateConfig($config) {
if (!is_array($config)) {
throw new InvalidArgumentException('Ожидается массив, получен ' . gettype($config));
}
// Дальнейшая обработка...
}
validateConfig(['db' => 'mysql']); // OK
validateConfig('string'); // ИсключениеЭто надёжный способ гарантировать, что аргумент функции является массивом, избегая побочных эффектов.
Пример 5. Проверка вложенных массивов (многомерных)
$nested = [
'first' => ['a', 'b'],
'second' => 'not array',
];
foreach ($nested as $key => $val) {
if (is_array($val)) {
echo "Ключ '$key' содержит массив\n";
} else {
echo "Ключ '$key' не массив\n";
}
}Ключ 'first' содержит массив Ключ 'second' не массив
Никаких дополнительных рекурсивных проверок не требуется; is_array() работает на любом уровне вложенности.