2010-08-30 129 views
11

使用PHP,有没有一个函数/方法/方法来检查变量是否包含可以安全地放入foreach构造的东西?就像有没有办法测试变量“isForEachable”

//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

相关:http://stackoverflow.com/questions/3584700/iterable-objects-and-array-type- hinting/ – quantumSoup 2010-08-30 04:10:36

回答

15

嗯,有点。你可以这样做:

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

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

请参阅Traversable。数组不是对象,因此不能实现这种接口(它们在它之前),但它们可以在循环中遍历。

+0

例如DOMNodeList也是一个拥有自己方法的对象,但奇怪的是它的foreach兼容,它的!is_array(...)。 – thevikas 2010-08-30 05:01:53

+0

请注意,对象也是可以使用的,所以你可能希望添加“||”。 is_object($ var)'到条件。 – jchook 2016-08-19 02:26:21

-2

检查使用is_array

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

您也可以对对象进行foreach – Galen 2010-08-30 04:03:29

+0

'foreach'循环支持的不仅仅是数组。 – Artefacto 2010-08-30 04:03:41

+0

谢谢你清理那个。道歉,我的不好。我不太使用PHP OOP。 – shamittomar 2010-08-30 04:13:34

0

由于所有对象和数组 “foreachable” 在PHP 5 + ...

function is_foreachable($var) { 
    return is_array($var) || is_object($var); 
} 
相关问题