Есть ли способ проверить переменную для "isForEachable" - PullRequest
11 голосов
/ 30 августа 2010

Используя PHP, есть ли функция / метод / способ, чтобы проверить, содержит ли переменная что-то, что было бы безопасно поместить в конструкцию foreach?Что-то вроде

//the simple case, would probably never use it this bluntly
function foo($things)
{
    if(isForEachable($things))
    {
        foreach($things as $thing)
        {
            $thing->doSomething();
        }
    }
    else
    {
        throw new Exception("Can't foreach over variable");
    }
}

Если ваш ответ «настроить обработчик для обнаружения ошибки PHP», ваши усилия приветствуются, но я ищу что-то еще.

Ответы [ 3 ]

15 голосов
/ 30 августа 2010

Ну, вроде как. Вы можете сделать:

if (is_array($var) || ($var instanceof Traversable)) {
    //...
}

Однако это не гарантирует, что цикл foreach будет успешным. Это может выдать исключение или молча провалиться Причина в том, что некоторые итерируемые объекты в какой-то момент могут не иметь никакой информации для получения (например, они уже были итерированы, и имеет смысл только итерировать их один раз).

См. Traversable. Массивы не являются объектами и, следовательно, не могут реализовать такой интерфейс (они предшествуют ему), но их можно обойти в цикле foreach.

2 голосов
/ 19 августа 2016

PHP 7

Последние версии PHP имеют is_iterable() и iterable псевдотип.


PHP5

Поскольку все объекты и массивы в PHP " foreachable ", 5 + ...

function is_foreachable($var) {
  return is_array($var) || is_object($var);
}
0 голосов
/ 30 августа 2010

Проверка с использованием is_array

if( is_array($things) )
      echo "it is foreachable";
else
      echo "Not it's not foreachable.";
...