Menu

PHP empty(): leere Strings, Arrays und 0 prüfen

empty($var) liefert true, wenn eine Variable fehlt oder falsy ist: null, false, 0, 0.0, "", "0" oder []. Es warnt nie bei undefinierten Variablen oder Schlüsseln. Hier: warum "0" als leer zählt, wie du genau auf einen leeren String oder ein leeres Array prüfst, empty vs isset und Formulareingaben prüfen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

empty($var) liefert true, wenn die Variable nicht existiert oder ihr Wert falsy ist: null, false, 0, 0.0, "", "0" oder ein leeres Array []. Für jeden anderen Wert liefert es false. Wie isset() warnt es nie bei undefinierten Variablen oder Array-Schlüsseln.

empty($x) entspricht !isset($x) || !$x. Anders gesagt: fehlt, oder wird zu false.

Welche Werte leer sind

Wähle in der Tabelle einen Wert, um empty() neben isset() und dem Cast (bool) zu sehen. Jede Zelle wurde von PHP 8.3 berechnet.

empty, isset und (bool) für jeden Wert von $x
Point at or tap a cell to read it as PHP.
$xemptyissetbool
null
false
0
0.0
""
"0"
[]
" "
"0.0"
"a"
"null"
[0]
1
-1
Every cell computed by PHP 8.3.19.

Die Überraschungen liegen an beiden Enden: "0" ist leer, während " " (ein Leerzeichen), "0.0", "null" und [0] es nicht sind.

"0" ist leer: der klassische Bug

Weil "0" falsy ist, behandelt empty() eine Menge von 0, eine Punktzahl von 0 oder eine PIN "0" als „nichts eingegeben“. Das trifft dich bei Formularen, wo jeder Wert als String ankommt.

Bei Texteingaben ist die zuverlässige Prüfung auf „nichts eingegeben“ trim($value) === "". Behalte empty() für Werte, bei denen 0 wirklich nichts bedeutet.

Prüfen, ob ein String leer ist

Um genau auf einen leeren String zu testen, vergleichst du mit "". Um auch Leerraum als leer zu behandeln, rufst du vorher trim auf. Seit PHP 5.5 akzeptiert empty() Ausdrücke, also funktioniert auch empty(trim($s)) (hat aber dasselbe Problem mit "0").

trim() akzeptiert ab PHP 8.1 kein null ohne Deprecation-Hinweis, deshalb schreibt der Block trim($s ?? "").

Prüfen, ob ein Array leer ist

Bei Arrays liefern empty($arr), $arr === [] und count($arr) === 0 alle dieselbe Antwort. empty() hat den Vorteil, dass es auch bei einer Variable oder einem Schlüssel funktioniert, die vielleicht nicht existieren.

array_filter() ohne Callback entfernt jeden falsy Wert und ist damit eine schnelle Art zu fragen, „ob dieses Array etwas Echtes enthält“.

Ein Pflichtfeld im Formular prüfen

!empty() ist ein üblicher Weg, ein Feld zur Pflicht zu machen, solange 0 keine gültige Antwort ist. Führe diesen Block aus, lass die Felder leer und klicke auf Send, füll sie dann aus und sende erneut: Das Skript läuft noch einmal, mit gefülltem $_POST.

empty($_POST["terms"]) deckt bei der Checkbox beide Fälle ab: gar nicht gesendet oder mit leerem Wert gesendet. Die Seite zu Formularen geht mit Fehlermeldungen pro Feld weiter.

empty vs isset

Beide sind bei undefinierten Variablen und Schlüsseln sicher. Sie beantworten verschiedene Fragen:

  • isset($x): Existiert es und ist es nicht null? Verwende es für optionale Schlüssel, Checkboxen und „wurde das überhaupt gesendet“.
  • !empty($x): Existiert es und ist es truthy? Verwende es für „hat etwas Echtes“, wenn 0 und "0" nicht zählen.
  • $x === "" oder $x === []: Ist es genau leer? Verwende es, wenn 0 ein gültiger Wert ist.

Die Seite zu isset behandelt die andere Hälfte, einschließlich isset() mit mehreren Variablen auf einmal und dem Unterschied zu array_key_exists().

Häufig gestellte Fragen

Welche Werte hält empty() in PHP für leer?

empty($x) ist true, wenn $x nicht existiert oder null, false, 0, 0.0, "", "0" oder [] ist. Alles andere ist nicht leer, auch " " (ein Leerzeichen), "0.0", "false" und [0].

Warum ist "0" in PHP leer?

empty() entspricht !$x ohne die Warnung bei undefinierten Variablen, und der String "0" wird zu false. Damit ist empty() falsch bei Feldern, in denen 0 eine gültige Antwort ist; prüfe dort stattdessen $x === '' oder trim($x) === ''.

Wie prüfe ich in PHP, ob ein Array leer ist?

empty($arr) und $arr === [] funktionieren beide, ebenso count($arr) === 0. empty() liefert außerdem true, wenn die Variable nicht gesetzt ist, während count() bei einer undefinierten Variable warnen und dann bei null einen TypeError werfen würde.

Wann sollte ich empty() statt isset() verwenden?

Verwende isset(), wenn du nur wissen musst, dass ein Wert existiert (eine Checkbox wurde gesendet, ein Konfigurationsschlüssel ist da). Verwende !empty(), wenn der Wert außerdem nicht leer sein darf, zum Beispiel bei einem Pflicht-Textfeld. Vorsicht bei Feldern, in denen 0 gültig ist, denn empty('0') ist true.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S