players
ist entweder leer oder eine durch Kommas getrennte Liste (oder ein einzelner Wert). Was ist der einfachste Weg, um zu überprüfen, ob es leer ist? Ich gehe davon aus, dass ich dies tun kann, sobald ich das $gameresult
Array $gamerow
abrufe. In diesem Fall wäre es wahrscheinlich effizienter, das Explodieren zu überspringen, $playerlist
wenn es leer ist. Wie würde ich aus Gründen der Argumentation prüfen, ob ein Array ebenfalls leer ist?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Antworten:
Wenn Sie nur überprüfen müssen, ob das Array ALLE Elemente enthält
Wenn Sie leere Werte vor dem Überprüfen bereinigen müssen (im Allgemeinen, um
explode
seltsame Zeichenfolgen zu vermeiden ):quelle
empty()
.if(!isset($emptyarray))
istfalse
aberif(empty($emptyarray))
zurücktrue
. Das hat mich gerade genageltEin leeres Array ist in PHP falsch, sodass Sie es nicht einmal verwenden müssen,
empty()
wie andere vorgeschlagen haben.PHP stellt
empty()
fest , ob eine Variable existiert nicht mehr oder hat einen Falsey Wert (wiearray()
,0
,null
,false
, etc.).In den meisten Fällen möchten Sie nur überprüfen
!$emptyVar
. Verwendenempty($emptyVar)
Sie diese Option, wenn die Variable möglicherweise nicht festgelegt wurde UND Sie keineE_NOTICE
; IMO ist dies im Allgemeinen eine schlechte Idee.quelle
Einige anständige Antworten, aber ich dachte nur, ich würde etwas erweitern, um klarer zu erklären, wann PHP feststellt, ob ein Array leer ist.
Hauptnotizen:
Ein Array mit einem Schlüssel (oder Schlüsseln) wird von PHP als NICHT leer bestimmt .
Da für Array-Werte Schlüssel erforderlich sind, wird durch das Vorhandensein von Werten in einem Array nicht bestimmt, ob es leer ist oder nicht, nur wenn keine Schlüssel vorhanden sind (UND daher keine Werte).
empty()
Wenn Sie also ein Array mit überprüfen, erfahren Sie nicht nur, ob Sie Werte haben oder nicht, sondern auch, ob das Array leer ist und Schlüssel Teil eines Arrays sind.Überlegen Sie sich also, wie Sie Ihr Array erstellen, bevor Sie entscheiden, welche Überprüfungsmethode verwendet werden soll.
EG Ein Array wird Tasten haben , wenn ein Benutzer Ihres HTML - Formular sendet , wenn jedes Formularfeld einen Array - Namen (dh hat
name="array[]"
). Für jedes Feld wirdein nicht leeres Array erstellt, da für das Array jedes Formularfelds automatisch inkrementierte Schlüsselwerte vorhanden sind.
Nehmen Sie zum Beispiel diese Arrays:
Wenn Sie die Array-Schlüssel und -Werte für die oben genannten Arrays wiedergeben, erhalten Sie Folgendes:
Wenn Sie die obigen Arrays mit testen, erhalten Sie
empty()
die folgenden Ergebnisse:Ein Array ist immer leer, wenn Sie ein Array zuweisen, es danach jedoch nicht mehr verwenden, z. B.:
Dies ist leer, dh PHP gibt TRUE zurück, wenn es
empty()
oben verwendet wird.Wenn Ihr Array also Schlüssel hat - entweder durch die Eingabenamen eines Formulars oder wenn Sie diese manuell zuweisen (dh ein Array mit Datenbankspaltennamen als Schlüssel, aber ohne Werte / Daten aus der Datenbank erstellen), ist das Array NICHT
empty()
.In diesem Fall können Sie das Array in einem foreach schleifen und testen, ob jeder Schlüssel einen Wert hat. Dies ist eine gute Methode, wenn Sie das Array trotzdem durchlaufen müssen, um möglicherweise die Schlüssel zu überprüfen oder Daten zu bereinigen.
Es ist jedoch nicht die beste Methode, wenn Sie nur wissen müssen, ob Werte vorhanden sind, die TRUE oder FALSE zurückgeben . Es gibt verschiedene Methoden, um festzustellen, ob ein Array Werte hat, wenn bekannt ist, dass es Schlüssel hat. Eine Funktion oder Klasse ist möglicherweise der beste Ansatz, hängt jedoch wie immer von Ihrer Umgebung und den genauen Anforderungen sowie von anderen Faktoren ab, z. B. davon, was Sie derzeit mit dem Array tun (falls vorhanden).
Hier ist ein Ansatz, bei dem nur sehr wenig Code verwendet wird, um zu überprüfen, ob ein Array Werte enthält:
Verwenden von
array_filter()
:Iteriert über jeden Wert im Array und übergibt ihn an die Rückruffunktion. Wenn die Rückruffunktion true zurückgibt, wird der aktuelle Wert aus dem Array in das Ergebnisarray zurückgegeben. Array-Schlüssel bleiben erhalten.
Das Ausführen
array_filter()
auf allen drei Beispielarrays (die im ersten Codeblock dieser Antwort erstellt wurden) führt zu folgenden Ergebnissen:Wenn also keine Werte vorhanden sind, unabhängig davon, ob Schlüssel vorhanden sind oder nicht, wird
array_filter()
durch Erstellen eines neuen Arrays und Überprüfen, ob das neue Array leer ist, angezeigt, ob das ursprüngliche Array Werte enthält.Es ist nicht ideal und ein bisschen chaotisch, aber wenn Sie ein riesiges Array haben und es aus keinem anderen Grund durchlaufen müssen, ist dies der einfachste Code.
Ich habe keine Erfahrung mit der Überprüfung von Overheads, aber es wäre gut, die Unterschiede zwischen der Verwendung
array_filter()
und derforeach
Überprüfung zu kennen , ob ein Wert gefunden wird.Offensichtlich müsste der Benchmark auf verschiedenen Parametern liegen, auf kleinen und großen Arrays und wenn es Werte gibt und nicht usw.
quelle
array_filter()
count(array())==0
ist falsch, wenn Schlüssel und keine Werte vorhanden sind. Dies hilft also nicht, nur nach Werten zu suchen . Ihre Aussage ist korrekt, aber Sie erzwingen einen Test mit,count(array())
da das Array natürlich leer ist. Wir müssen überprüfen, wann das Array von einem Formular oder einem anderen Ort zurückgekehrt ist, um zu wissen, ob es leer ist (Schlüssel / Werte) oder nur Werte hat oder nichtarray_filter($_FILES["documento"]['name'])
count($gamerow['players'])
wird 0 sein.quelle
Wenn Sie feststellen möchten, ob die zu testende Variable tatsächlich explizit ein leeres Array ist, können Sie Folgendes verwenden:
quelle
Wenn Sie die falschen oder leeren Zeilen (z. B.
0 => ''
) ausschließen möchten , bei denen die Verwendungempty()
fehlschlägt, können Sie Folgendes versuchen:Wenn Sie alle NULL-, FALSE- und leeren Zeichenfolgen (
''
) entfernen möchten, aber Nullwerte (0
) belassen möchten , können Sie diesstrlen
als Rückruf verwenden, z.quelle
Warum hat niemand diese Antwort gesagt:
quelle
array()
ist das Gleiche.is_array
quelle
explode()
- es gibt Daten vom Array-Typ zurück. Das Überprüfenempty()
ist ein nicht benötigter Funktionsaufruf. Wie von Cobby im Jahr 2012 angegeben,if($detect)
ist alles, was erforderlich ist. Diese Lösung sollte nicht für diese oder andere Aufgaben implementiert werden. Man könnte argumentieren , dass man Situationen jenseits dieser Frage des Umfangs bedecken, na ja, es gibt nie eine Notwendigkeit, rufenempty()
NACHis_array()
weil , wenn die Variable nicht „gesetzt“ ist, dannis_array()
erzeugt wird „Hinweis: Nicht definierte Variable“, wennisset()
dannempty()
viel des Guten ist, gerade Einsatz Cobbys Antwort.Ich habe den am Ende des Beitrags enthaltenen Benchmark ausgeführt. So vergleichen Sie die Methoden:
count($arr) == 0
: Anzahlempty($arr)
: leer$arr == []
: comp(bool) $arr
: Besetzungund bekam die folgenden Ergebnisse
Der Unterschied zwischen leer und Casting in einen Booleschen Wert ist unbedeutend. Ich habe diesen Test mehrmals durchgeführt und sie scheinen im Wesentlichen gleichwertig zu sein. Der Inhalt der Arrays scheint keine wesentliche Rolle zu spielen. Die beiden führen zu den entgegengesetzten Ergebnissen, aber die logische Negation reicht kaum aus, um das Casting die meiste Zeit zum Gewinnen zu bringen. Ich persönlich bevorzuge es aus Gründen der Lesbarkeit in beiden Fällen, leer zu sein.
quelle
sizeof
welcher [nicht?] Alias vonempty
... stackoverflow.com/a/51986794/1429432Wenn Sie den Array-Inhalt überprüfen möchten, können Sie Folgendes verwenden:
siehe hier: http://codepad.org/EORE4k7v
quelle
Meiner Meinung nach wäre der einfachste Weg für ein indiziertes Array einfach:
Eine 'if'-Bedingung für das Array würde als wahr ausgewertet, wenn das Array nicht leer ist, und als falsch, wenn das Array leer ist . Dies gilt nicht für assoziative Arrays.
quelle
Ich benutze diesen Code
Beachten Sie jedoch, dass dieser Code, wenn das Array eine große Anzahl von Schlüsseln enthält, im Vergleich zu den anderen Antworten hier viel Zeit damit verbringt, diese zu zählen.
quelle
Sie können verwenden,
array_filter()
was für alle Situationen gut funktioniert:quelle
quelle
Ich denke, der beste Weg, um festzustellen, ob das Array leer ist oder nicht, ist die Verwendung von count () wie folgt:
quelle
count()
Anruf kann vollständig entfernt werden - siehe die Antwort von Cobby.Um die am besten geeignete Entscheidung zu treffen, müssen Sie die Qualität Ihrer Daten kennen und wissen, welche Prozesse zu befolgen sind.
Wenn Sie diese Zeile disqualifizieren / ignorieren / entfernen möchten, sollte der früheste Filterpunkt in der MySQL-Abfrage liegen.
WHERE players IS NOT NULL
WHERE players != ''
WHERE COALESCE(players, '') != ''
WHERE players IS NOT NULL AND players != ''
Wenn Sie nicht 100% sicher sind, ob die Spalte in der Ergebnismenge vorhanden ist, sollten Sie überprüfen, ob die Spalte deklariert ist. Dies bedeutet , ruft
array_key_exists()
,isset()
oderempty()
auf der Säule. Ich werde mich nicht darum kümmern, die Unterschiede hier zu beschreiben (es gibt andere SO-Seiten für diese Aufschlüsselung, hier ist ein Anfang: 1 , 2 , 3 ). Wenn Sie jedoch nicht die vollständige Kontrolle über die Ergebnismenge haben, haben Sie möglicherweise zu viel Flexibilität bei der Anwendung und sollten überdenken, ob sich die Mühe lohnt, möglicherweise auf nicht vorhandene Spaltendaten zuzugreifen. Eigentlich sage ich, dass Sie niemals überprüfen müssen, ob eine Spalte deklariert ist - also sollten Sie niemals brauchenempty()
diese Aufgabe . Wenn jemand das argumentiertempty()
ist angemessener, dann drängen sie ihre eigene persönliche Meinung über die Ausdruckskraft von Skripten. Wenn Sie feststellen, dass die Bedingung in # 5 unten nicht eindeutig ist, fügen Sie Ihrem Code einen Inline-Kommentar hinzu - aber das würde ich nicht. Das Fazit ist, dass der Funktionsaufruf keinen programmatischen Vorteil hat.Könnte Ihr Zeichenfolgenwert einen Wert enthalten
0
, den Sie für wahr / gültig / nicht leer halten möchten? Wenn ja, müssen Sie nur prüfen, ob der Spaltenwert eine Länge hat.Hier ist eine Demo mit
strlen()
. Dies zeigt an, ob die Zeichenfolge bei Explosion sinnvolle Array-Elemente erstellt.Ich denke, es ist wichtig zu erwähnen, dass Sie durch bedingungsloses Explodieren GARANTIERT sind, ein nicht leeres Array zu generieren. Hier ist der Beweis: Demo Mit anderen Worten, die Überprüfung, ob das Array leer ist, ist völlig nutzlos - es ist jedes Mal nicht leer.
Wenn Ihre Zeichenfolge möglicherweise keinen Nullwert enthält (weil dies beispielsweise eine CSV ist, die aus IDs besteht, die von
1
und nur inkrementieren),if ($gamerow['players']) {
ist alles, was Sie brauchen - Ende der Geschichte.... aber warte, was machst du, nachdem du die Leere dieses Wertes festgestellt hast? Wenn Sie ein Down-Script haben, das Sie erwartet
$playerlist
, diese Variable jedoch bedingt deklarieren, besteht die Gefahr, dass Sie den Wert der vorherigen Zeile verwenden oder erneut Benachrichtigungen generieren. Müssen Sie sich also bedingungslos$playerlist
als etwas deklarieren ? Wenn die Zeichenfolge keine wahrheitsgemäßen Werte enthält, profitiert Ihre Anwendung davon, ein leeres Array zu deklarieren? Die Antwort lautet wahrscheinlich Ja. In diesem Fall können Sie sicherstellen, dass die Variable vom Typ Array ist, indem Sie auf ein leeres Array zurückgreifen. Auf diese Weise spielt es keine Rolle, ob Sie diese Variable in eine Schleife einspeisen. Die folgenden bedingten Erklärungen sind alle gleichwertig.$playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];
Warum habe ich mich so lange bemüht, diese grundlegende Aufgabe zu erklären?
quelle
quelle
$matches = preg_grep ( "/^$text (\w+)/i" , $array ) ;
, um ihn zu überprüfen. Ich benutze ihnif ( count ( $matches ) > 0 )
empty()
zu viel Arbeit leistet.Ich habe dieses Problem mit folgendem Code gelöst.
quelle
Dies scheint in allen Fällen zu funktionieren
quelle
Wie wäre es mit:
quelle