Способы определения массива в PHP: от is_array до gettype

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

Проверка переменной на принадлежность к массиву в 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() работает на любом уровне вложенности.

- Php проверить массив (проверить, является ли переменная массивом в php)
- Array index php (индекс массива в php)
- Php array access (доступ к элементам массива в php)
- Php удалить первый элемент массива (php удалить первый элемент массива)
- Index php sort (сортировка в php)
- Php добавить (добавление в php)
- содержимое массива php (php вывод содержимого массива)
- Php первый элемент (получение первого элемента в php)
- Php получить значения массива (получение значений массива в php)
- Php получить массив (получение массива в php)
- Php длина массива (длина массива php)
- Php добавить массив в конец массива (добавление элемента в конец массива php)
- получить элемент массива php (получение элемента массива в php)

Проверить, является ли переменная массивом в PHP - comments

En
Php проверить массив (php)