有没有一种方法可以测试一个变量是否可遍历?

14
使用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错误”,那么我很感激你的努力,但我正在寻找其他东西。

1
相关链接:https://dev59.com/unA65IYBdhLWcg3w4CwL - quantumSoup
3个回答

17

有点像。您可以执行以下操作:

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

然而,这并不能保证 foreach 循环一定会成功。它可能会抛出异常或者默默失败。原因是某些可迭代对象在某个时刻可能没有任何信息可供产生 (例如,它们已经被迭代过了,只有迭代一次才有意义)。

请参见Traversable。数组不是对象,因此无法实现这种接口 (它们早于这个接口),但可以在 foreach 循环中遍历它们。


DOMNodeList也是一个拥有自己方法的对象,但奇怪的是它的foreach兼容且!is_array(...)。 - thevikas
3
请注意,对象也可以被foreach遍历,因此您可能希望将 || is_object($var) 添加到条件语句中。 - jchook

6

PHP 7

最近的 PHP 版本已经具有 is_iterable()iterable 伪类型。


PHP 5

自 PHP 5+ 版本起,所有对象和数组都可以进行 "foreachable" 操作...

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

Is_iterable仍然没有用处。它会在可循环对象上返回false。 - Brad

-2

使用is_array进行检查

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

foreach循环支持的不仅仅是数组。 - Artefacto
感谢你澄清这个问题。抱歉,是我的错。我不是很常使用PHP OOP。 - shamittomar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接