有没有办法测试“isForEachable”的变量

时间:2010-08-30 03:58:32

标签: php iterator foreach

使用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 个答案:

答案 0 :(得分:15)

好吧,有点儿。你可以这样做:

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

但是,这并不能保证foreach循环成功。它可能会抛出异常或无声地失败。原因是某些可迭代对象在某些时候可能没有任何信息可以产生(例如,它们已经被迭代,只有迭代它们才有意义。)

Traversable。数组不是对象,因此不能实现这样的接口(它们先于它),但它们可以在foreach循环中遍历。

答案 1 :(得分:2)

PHP 7

最新版本的PHP有is_iterable()iterable伪类型。

PHP 5

由于所有对象和数组都是" foreachable"在PHP 5 + ...

function is_foreachable($var) {
  return is_array($var) || is_object($var);
}

答案 2 :(得分:-2)

使用is_array

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