MWCodebymw.de ↗
PHP

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']);     // 1

Jede 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

#PHP#PHP 8.4#Arrays#array_find#Callbacks

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 →