2010-08-30 23 views
11

Przy użyciu PHP, czy istnieje funkcja/metoda/sposób sprawdzenia, czy zmienna zawiera coś, co byłoby bezpieczne do umieszczenia w konstrukcji foreach? Coś jakCzy istnieje sposób przetestowania zmiennej dla "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"); 
    } 
} 

Jeśli odpowiedź brzmi „setup program obsługi złapać błąd php”, twoje wysiłki są doceniane, ale szukam czegoś innego.

+1

pokrewne: http://stackoverflow.com/questions/3584700/iterable-objects-and-array-type- Podpowiedź/ – quantumSoup

Odpowiedz

15

Cóż, w pewnym sensie. Można to zrobić:

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

to jednak nie gwarantuje, że pętla foreach będzie udany. Może wyrzucić wyjątek lub nie działać w trybie cichym. Powodem jest to, że niektóre obiekty iteracyjne w pewnym momencie mogą nie mieć żadnej informacji do przekazania (na przykład były już iterowane i ma sens tylko iterowanie ich raz).

Zobacz Traversable. Tablice nie są obiektami i dlatego nie mogą implementować takiego interfejsu (wcześniej go poprzedzały), ale można je przetestować w pętli foreach.

+0

np. DOMNodeList jest również obiektem z własną metodą, ale dziwnie jest kompatybilny z foreach i jego! Is_array (...). – thevikas

+0

Zwróć uwagę, że obiekty są również dostępne, możesz więc dodać '|| is_object ($ var) 'do warunkowego. – jchook

-2

Sprawdź używając is_array

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

można również przepuszczać obiekty – Galen

+0

Pętla 'foreach' obsługuje znacznie więcej niż tablice. – Artefacto

+0

Dzięki za wyczyszczenie tego. Przepraszam, moja zła. Nie używam dużo OOP PHP. – shamittomar

0

Ponieważ wszystkie obiekty i tablice są "foreachable" w PHP 5 + ...

function is_foreachable($var) { 
    return is_array($var) || is_object($var); 
} 
Powiązane problemy