2010-08-30 34 views
11

PHP'yi kullanarak, bir değişkenin foreach yapısına yerleştirilebilecek güvenli bir şey içerip içermediğini kontrol etmek için bir işlev/yöntem/yöntem var mı? Cevabınız "kurulum PHP hatası yakalamak için bir işleyici", çabaları takdir edilmektedir, ama başka bir şey arıyorum ise"isForEachable" için bir değişken test etmenin bir yolu var mı

//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"); 
    } 
} 

gibi bir şey.

+1

İlgili: http://stackoverflow.com/questions/3584700/iterable-objects-and-array-type- ipucu/ – quantumSoup

cevap

15

Kuyusu kullanarak. Sen yapabilirsin:

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

Ancak bu foreach döngü başarılı olacağını garanti etmez. Bir istisna atabilir veya sessizce başarısız olabilir. Bunun nedeni, bazı yinelenebilir nesnelerin, bir noktada, elde edilecek herhangi bir bilgi içermeyebileceğidir (örneğin, zaten yinelenmişlerdi ve sadece bir kez yinelemek anlamlıdır).

Bkz. Traversable. Diziler nesne değildir ve bu nedenle böyle bir arabirimi uygulayamazlar (önyükleme yaparlar), ancak foreach döngüsünde geçirilebilirler.

+0

örn. DOMNodeList, kendi yöntemine sahip ancak garip bir foreach uyumlu ve onun! Is_array (...) bir nesnesidir. – thevikas

+0

, nesnelerin de atlanabileceğine dikkat edin, böylece '|| koşullu olarak is_object ($ var). – jchook

-2

Kontrol çeşit, is_array

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

Nesneleri de foreach yapabilirsiniz – Galen

+0

"foreach" döngüsü dizilerden çok daha fazlasını destekler. – Artefacto

+0

Bunu temizlediğiniz için teşekkürler. Özür dilerim, kötüyüm. PHP OOP'u çok kullanmıyorum. – shamittomar

0

tüm nesneler ve dizi olduklarından "foreachable" PHP 5 + ...

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