Как проверить, является ли переменная массивом?... или что-то вроде массива


Я хочу использовать foreach цикл с переменной, эта переменная может быть много различных типов, NULL например.

Итак, перед foreach Я проверяю его:

if(is_array($var)){
  foreach($var as ...

но я понял, что это может быть класс, реализующий Iterator интерфейс. Может быть, я слепой, но как проверить, реализует ли класс интерфейс? Есть ли что-то вроде is_a функция или inherits оператор? Я нашел class_implements, Я могу использовать его, но, может быть, есть что-то проще?

и во-вторых, что более важно, я полагаю, что эта функция существует, было бы достаточно, чтобы проверить, если переменная is_array или "реализует Iterator интерфейс" или я должен проверить что-то еще?

4 70

4 ответа:

если вы используете foreach внутри функции и вы ожидаете массив или проходимым

foreach может обрабатывать массивы и объекты. Вы можете проверить это с:

$can_foreach = is_array($var) || is_object($var);
if ($can_foreach) {
    foreach ($var as ...
}

вам не нужно специально проверять Traversable как намекали другие в своих ответах, потому что все объекты - как и все массивы - могут быть пройдены в PHP.

более технически:

foreach работает со всеми видами траверсаблей, т. е. с массивами, с простыми объектами (где доступные свойства проходят) и Traversable объекты (точнее объекты, определяющие внутреннее get_iterator обработчик).

(источник)

просто сказал В общем программировании PHP, когда переменная

  • массив
  • объект

и не

  • NULL
  • ресурс
  • a скаляр

можно использовать foreach на нем.

вы можете проверить экземпляр Traversable С простой функцией. Это будет работать для всего этого Iterator, потому что Iterator extends Traversable

function canLoop($mixed) {
    return is_array($mixed) || $mixed instanceof Traversable ? true : false;
}
<?php
$var = new ArrayIterator();

var_dump(is_array($var), ($var instanceof ArrayIterator));

возвращает bool (false) bool(true)