Często zdarza mi się obsługiwać dane, które mogą być tablicą lub zmienną zerową, i karmić niektóre foreach
z tych danych.
$values = get_values();
foreach ($values as $value){
...
}
Gdy karmisz foreach danymi, które nie są tablicą, pojawia się ostrzeżenie:
Ostrzeżenie: podano nieprawidłowy argument dla foreach () w [...]
Zakładając, że nie można refaktoryzować get_values()
funkcji, aby zawsze zwracała tablicę (kompatybilność wsteczna, niedostępny kod źródłowy, bez względu na inny powód), zastanawiam się, który jest najczystszym i najbardziej wydajnym sposobem uniknięcia tych ostrzeżeń:
- Przesyłanie
$values
do tablicy - Inicjowanie
$values
do tablicy - Zawijanie
foreach
za pomocąif
- Inne (proszę zasugerować)
$values
to nie jest tablica.Odpowiedzi:
Osobiście uważam, że jest to najczystsze - nie jestem pewien, czy jest najbardziej wydajne, pamiętaj!
Powodem dla mnie jest to, że nie przydziela pustej tablicy, kiedy i tak nie masz nic na początek.
źródło
count()
nie jest wiarygodny. Jeśli przekażeszcount()
null, zwróci 0. Jeśli przekażesz argument inny niż null, nie będący tablicą, zwróci 1. Dlatego niemożliwecount()
jest określenie, czy zmienna jest tablicą, gdy zmienna może być pustą tablicą, lub tablica zawierająca 1 element.if (is_array($values) || $values instanceof Traversable)
.Co powiesz na ten? dużo czystsze i wszystko w jednej linii.
źródło
isset()
lubis_array()
obu, całkowicie w zależności od twojego scenariusza itp.Zwykle używam konstrukcji podobnej do tej:
Zauważ, że ta konkretna wersja nie jest testowana, jest wpisana bezpośrednio do SO z pamięci.
Edycja: dodano czek przejezdny
źródło
$var instanceof Traversable
. Zobacz tutaj . Ponieważ na przykład możesz przewidzieć SimpleXMLElement , ale nie jest to ani instancja Iterator, ani IteratorAggregate.is_object($var)
ponownie. php.net/manual/en/language.oop5.iterations.phpIterator
lubIteratorAggregate
, ale to oczywiście tylko moja opinia i dlatego subiektywna (nigdy nie używam pól publicznych).Nie polegaj na przesyłaniu jako rozwiązania , nawet jeśli inni sugerują to jako prawidłową opcję, aby zapobiec błędowi, może to spowodować inną.
Pamiętaj: jeśli oczekujesz zwrotu określonej formy tablicy, może to Cię nie powieść. Wymagane są w tym celu dodatkowe kontrole.
Napisałem szybki test, aby przedstawić ten problem . (Oto test zapasowy na wypadek, gdyby pierwszy testowy adres URL zawiódł).
Zawarte są testy dla:
null
,false
,true
, Aclass
,array
iundefined
.Zawsze sprawdzaj dane wejściowe przed użyciem ich w foreach. Propozycje:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
blokówarray_key_exists
określonego klucza lub przetestować głębokość tablicy (gdy jest to jeden!) .źródło
Spróbuj tego:
;)
źródło
Problem jest zawsze zerowy, a Casting jest w rzeczywistości rozwiązaniem czyszczącym.
źródło
Przede wszystkim należy zainicjować każdą zmienną. Zawsze.
Przesyłanie nie jest opcją.
if get_values (); może zwrócić zmienną innego typu, tę wartość należy oczywiście sprawdzić.
źródło
$array = (array)null;
, otrzymasz pustą tablicę. Oczywiście marnotrawstwo przydziału pamięci ;-)Bardziej zwięzłe rozszerzenie kodu @ Kris
szczególnie do używania wewnątrz kodu szablonu
źródło
return is_iterable($var) ? $var : array($var);
?Jeśli używasz php7 i chcesz obsłużyć tylko niezdefiniowane błędy, jest to najczystszy IMHO
źródło
To nie sprawdza, czy jest to tablica, ale pomija pętlę, jeśli zmienna jest pusta lub pusta.
źródło
Nie jestem pewien, czy tak jest, ale ten problem wydaje się występować wiele razy podczas migracji witryn Wordpress lub ogólnie migracji witryn dynamicznych. W takim przypadku upewnij się, że hosting, do którego przeprowadzasz migrację, używa tej samej wersji PHP, której używa stara witryna.
Jeśli nie przeprowadzasz migracji swojej witryny, a to jest tylko problem, który się pojawił, spróbuj zaktualizować do wersji PHP 5. To rozwiązuje niektóre z tych problemów. Może to wydawać się głupim rozwiązaniem, ale załatwiło sprawę.
źródło
Wyjątkowy przypadek tego zawiadomienia występuje, jeśli ustawisz tablicę na zero w pętli foreach
źródło
A co z tym rozwiązaniem:
źródło
Podano niepoprawny argument ostrzeżenia dla
foreach()
wyświetlanych tweetów. idź do/wp-content/plugins/display-tweets-php
. Następnie wstaw ten kod do linii numer 591, będzie działał idealnie.źródło
if (is_array($_POST['auto'])){ // code }
Wydaje się również, że istnieje związek ze środowiskiem:
Miałem ten błąd „dostarczono nieprawidłowy argument foreach ()” tylko w środowisku deweloperskim, ale nie w prod (pracuję na serwerze, a nie localhost).
Pomimo błędu zmienna_dump wskazała, że tablica jest w porządku (w obu przypadkach app i dev).
if (is_array($array))
Wokółforeach ($array as $subarray)
rozwiązało problem.Przepraszam, że nie potrafię wyjaśnić przyczyny, ale ponieważ znalezienie rozwiązania zajęło mi trochę czasu, pomyślałem o lepszym udostępnieniu tego jako spostrzeżenia.
źródło
Użyj funkcji is_array, gdy przekażesz tablicę do pętli foreach.
źródło
Co powiesz na zdefiniowanie pustej tablicy jako zastępczej, jeśli
get_value()
jest pusta?Nie mogę wymyślić najkrótszej drogi.
źródło
Użyję kombinacji
empty
,isset
ais_array
jakoźródło
zrobiłbym to samo co Andy, ale używałbym funkcji „pustej”.
tak:
źródło
$yourArray = 1;
spróbuje iterować, a otrzymasz błąd.empty()
nie jest odpowiednim testem.