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
First-Class-Callable-Syntax in PHP: aus strlen(...) wird ein echter Wert
Funktionen als Zeichenketten weiterzureichen – 'strlen', [$objekt, 'methode'] – hat nie jemand gemocht: kein Tippfehlerschutz, keine Sprungmarke in der IDE. Seit PHP 8.1 schreibst du drei Punkte und bekommst ein Closure-Objekt.
toSorted, toReversed und with: Arrays sortieren, ohne das Original zu zerstören
array.sort() sortiert nicht eine Kopie, sondern das Array selbst – und genau daran ist schon mancher Zustand im Frontend stillschweigend kaputtgegangen. Seit ES2023 gibt es zu jeder dieser Methoden eine Variante, die eine Kopie zurückgibt.
Set und Map in JavaScript – doppelte Einträge loswerden und richtig zählen
Ein Objekt als Nachschlagetabelle geht – bis der Schlüssel eine Zahl ist, oder ein Objekt, oder zufällig "constructor" heißt. Set und Map machen genau das, wofür man Objekte bisher zweckentfremdet hat, nur ohne die Überraschungen.