Start · Sprachen · PHP · Referenz · is_iterable

is_iterable

Funktion

Prüft, ob eine Variable iterierbar ist, d. h. ob sie ein <code>array</code> oder ein Objekt ist, das <code>Traversable</code> implementiert.

seit PHP 7.1.0 Kategorie: type

Signatur

is_iterable(mixed $value): bool

Beschreibung

is_iterable() gibt true zurück, wenn der übergebene Wert entweder ein array ist oder ein Objekt, das das Interface Traversable implementiert (z. B. Instanzen von Iterator, IteratorAggregate oder Generator). In allen anderen Fällen – also bei null, Zahlen, Strings, Booleans oder gewöhnlichen Objekten ohne Traversable – wird false zurückgegeben.

Die Funktion ist besonders nützlich, wenn Code generisch geschrieben werden soll, der sowohl Arrays als auch Traversable-Objekte verarbeitet. Statt manuell mit is_array() und instanceof Traversable zu prüfen, bietet is_iterable() eine kompakte, gut lesbare Alternative.

Typischerweise wird is_iterable() eingesetzt, bevor eine foreach-Schleife über einen möglicherweise nicht iterierbaren Wert ausgeführt wird, um einen TypeError oder eine Warning zu vermeiden. In typsicheren Projekten kann es als Laufzeit-Absicherung ergänzend zum Typ-System dienen.

Parameter

Name Typ Default Beschreibung
$value Pflicht mixed Der zu prüfende Wert beliebigen Typs.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn value ein array ist oder ein Objekt, das Traversable implementiert. Andernfalls false.

Beispiele

Grundlegende Verwendung mit verschiedenen Typen

<?php
$array    = [1, 2, 3];
$generator = (function() { yield 1; yield 2; })();
$string   = 'Hallo';
$object   = new stdClass();

var_dump(is_iterable($array));     // true  – Array
var_dump(is_iterable($generator)); // true  – Generator implementiert Traversable
var_dump(is_iterable($string));    // false – String ist nicht iterierbar
var_dump(is_iterable($object));    // false – stdClass implementiert kein Traversable
var_dump(is_iterable(null));       // false
bool(true) bool(true) bool(false) bool(false) bool(false)

Sichere foreach-Schleife mit is_iterable()

<?php
function verarbeiteElemente(mixed $daten): void
{
    if (!is_iterable($daten)) {
        throw new InvalidArgumentException(
            'Es wird ein iterierbarer Wert erwartet, ' . gettype($daten) . ' übergeben.'
        );
    }

    foreach ($daten as $element) {
        echo $element . PHP_EOL;
    }
}

verarbeiteElemente(['Apfel', 'Birne', 'Kirsche']);

// Löst eine Exception aus:
// verarbeiteElemente('kein Array');
Apfel Birne Kirsche

Prüfung eines ArrayIterator-Objekts

<?php
$iterator = new ArrayIterator([10, 20, 30]);

if (is_iterable($iterator)) {
    foreach ($iterator as $wert) {
        echo $wert . ' ';
    }
}
10 20 30

// Wichtig · Fallstricke

Äquivalenz: is_iterable($value) entspricht dem Ausdruck is_array($value) || ($value instanceof Traversable). Die eingebaute Funktion ist jedoch lesbarer und direkt auf den Pseudotyp iterable abgestimmt, der in PHP 7.1 eingeführt wurde.

Kein Deep-Check: is_iterable() überprüft nur, ob der Wert grundsätzlich iterierbar ist, nicht ob er leer ist oder bestimmte Elemente enthält. Für leere Arrays gibt die Funktion ebenfalls true zurück.

Nicht zu verwechseln mit is_array(): Objekte, die Traversable implementieren, sind iterierbar, aber keine Arrays. is_array() würde für diese false liefern.