2010-08-30 127 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); 
} 
相關問題