array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
Fast jeder Datensatz, mit dem ich arbeite, ist eine Liste von Zeilen: Dienste, Bestellungen, Nutzer, Termine. Und ständig will man dasselbe von so einer Liste wissen – „gibt es hier einen, der …?", „gilt das für alle?", „gib mir den ersten, der passt". Bisher stand dafür überall eine foreach-Schleife mit break, und die sah jedes Mal ein bisschen anders aus. PHP 8.4 hat dafür vier Funktionen bekommen, die das in einer Zeile erledigen.
Der bisherige Weg
$hatInaktiven = false;
foreach ($dienste as $d) {
if (!$d['aktiv']) { $hatInaktiven = true; break; }
}Funktioniert – aber drei Zeilen, eine Hilfsvariable, und beim Überfliegen muss man erst das break finden, um zu verstehen, dass hier nur *ob überhaupt* gefragt wird.
Der neue Weg
<?php
$dienste = [
['name' => 'Website', 'aktiv' => true],
['name' => 'Newsletter', 'aktiv' => false],
['name' => 'Shop', 'aktiv' => true],
];
// Gibt es ÜBERHAUPT einen inaktiven Dienst?
$hatInaktiven = array_any($dienste, fn($d) => !$d['aktiv']); // true
// Sind ALLE aktiv?
$allesLaeuft = array_all($dienste, fn($d) => $d['aktiv']); // false
// Den ERSTEN inaktiven Dienst holen – nicht nur true/false:
$erster = array_find($dienste, fn($d) => !$d['aktiv']);
echo $erster['name']; // Newsletter
// Und wenn du den Schlüssel brauchst statt des Werts:
$index = array_find_key($dienste, fn($d) => !$d['aktiv']); // 1Jede Zeile sagt jetzt selbst, was sie will. array_any und array_all geben ein bool zurück, array_find den ersten passenden Wert (oder null, wenn keiner passt), array_find_key dessen Schlüssel. Der Callback bekommt jeweils den Wert und gibt true/false zurück – wie du es von array_filter schon kennst.
Zwei Dinge, die du wissen solltest
array_find gibt null zurück, wenn nichts passt – und null kann auch ein echter Treffer sein, wenn deine Liste null-Werte enthält. Willst du „gefunden" und „ist zufällig null" sauber trennen, frag vorher mit array_any, ob es überhaupt einen Treffer gibt.
Bei einer leeren Liste ist array_all immer true (es gibt keinen Gegenbeweis) und array_any immer false. Das ist mathematisch korrekt und trotzdem eine häufige Stolperfalle – prüf im Zweifel vorher, ob die Liste überhaupt Einträge hat.
Wann sich das lohnt
Ich benutze array_all gern für Freigaben: „Erst veröffentlichen, wenn jeder Pflichtblock ausgefüllt ist" wird zu array_all($bloecke, fn($b) => $b['fertig']). Und array_find überall da, wo ich sonst eine Schleife nur geschrieben hätte, um beim ersten Treffer return zu machen. Kürzerer Code, der sein Ziel im Namen trägt – und den du in einem halben Jahr ohne Nachdenken wieder liest.
Wichtig ist nur: Diese vier Funktionen gibt es erst ab PHP 8.4. Läuft dein Hosting noch auf 8.3 oder älter, bleibt es bei foreach – oder du hebst die PHP-Version an. Ich baue meine Projekte (z. B. das eigene CMS hinter bymw.de) ohnehin auf aktuellem PHP, allein wegen solcher kleinen Verbesserungen, die den Alltag Zeile für Zeile aufräumen.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Arrays sortieren in PHP – usort und der Spaceship-Operator
Eine Liste nach Datum, dann nach Name, absteigend – ohne Bibliothek und ohne if-Kaskade. usort plus <=> macht daraus zwei Zeilen, die man auch in einem halben Jahr noch versteht.
Eigene Exceptions in PHP – Fehler, die man auseinanderhalten kann
catch (Exception $e) fängt alles – auch das, was du gar nicht behandeln wolltest. Mit ein paar eigenen Exception-Klassen wird aus „irgendwas ging schief" eine Fehlermeldung, mit der der Nutzer etwas anfangen kann.
Generatoren in PHP – eine 2-GB-Datei lesen, ohne den Speicher zu sprengen
file() lädt die ganze Datei in ein Array – bei großen Dateien ist danach der Speicher voll und das Skript tot. Mit yield gibst du Zeile für Zeile heraus und brauchst konstant wenig Speicher, egal wie groß die Datei ist.