Arbeiten mit Iteratoren
Nette\Utils\Iterables ist eine statische Klasse mit Hilfsfunktionen für die Arbeit mit Iteratoren. Ihr Gegenstück für Arrays ist Nette\Utils\Arrays.
Installation:
composer require nette/utils
Alle Beispiele setzen voraus, dass der folgende Alias definiert wurde:
use Nette\Utils\Iterables;
contains (iterable $iterable, $value): bool
Prüft, ob der Iterator $iterable
den angegebenen Wert ($value
) enthält. Verwendet einen strikten
Vergleich (===
). Gibt true
zurück, wenn der Wert gefunden wird, andernfalls false
.
Iterables::contains(new ArrayIterator([1, 2, 3]), 1); // true
Iterables::contains(new ArrayIterator([1, 2, 3]), '1'); // false
Diese Methode ist nützlich, um schnell zu prüfen, ob ein bestimmter Wert in einem Iterator vorhanden ist, ohne alle Elemente manuell durchlaufen zu müssen.
containsKey (iterable $iterable, $key): bool
Sucht nach dem angegebenen Schlüssel im Iterator. Verwendet einen strikten Vergleich (===
) zur Überprüfung der
Übereinstimmung. Gibt true
zurück, wenn der Schlüssel gefunden wird, andernfalls false
.
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 0); // true
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 4); // false
every (iterable $iterable, callable $predicate): bool
Prüft, ob alle Elemente des Iterators $iterable
die im $predicate
definierte Bedingung erfüllen.
Das $predicate
(Signatur: function ($value, $key, iterable $iterable): bool
) muss für jedes Element
true
zurückgeben, damit every()
true
zurückgibt.
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isBelowThreshold = fn($value) => $value < 40;
$res = Iterables::every($iterator, $isBelowThreshold); // true
Diese Methode ist nützlich, um zu prüfen, ob alle Elemente einer Sammlung eine bestimmte Bedingung erfüllen (z.B. ob alle Zahlen kleiner als ein Grenzwert sind).
filter (iterable $iterable, callable $predicate): Generator
Erstellt einen neuen Iterator, der nur die Elemente aus dem ursprünglichen Iterator enthält, die die in
$predicate
definierte Bedingung erfüllen. Die Funktion $predicate
hat die Signatur
function ($value, $key, iterable $iterable): bool
und muss für die Elemente, die beibehalten werden sollen,
true
zurückgeben.
$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::filter($iterator, fn($v) => $v < 3);
// 1, 2
Die Methode verwendet einen Generator, d.h. die Filterung erfolgt ‘lazy’ beim Durchlaufen des Ergebnisses. Dies ist speichereffizient und ermöglicht die Verarbeitung sehr großer Sammlungen. Wenn nicht alle Elemente des resultierenden Generators durchlaufen werden, wird Rechenleistung gespart, da nicht alle Elemente des ursprünglichen Iterators verarbeitet werden müssen.
first (iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed
Gibt das erste Element des Iterators zurück. Wenn $predicate
angegeben ist, gibt es das erste Element zurück,
das die angegebene Bedingung erfüllt. Die Funktion $predicate
hat die Signatur
function ($value, $key, iterable $iterable): bool
. Wenn kein passendes Element gefunden wird, wird die Funktion
$else
aufgerufen (falls angegeben) und ihr Ergebnis zurückgegeben. Wenn $else
nicht angegeben ist, wird
null
zurückgegeben.
Iterables::first(new ArrayIterator([1, 2, 3])); // 1
Iterables::first(new ArrayIterator([1, 2, 3]), fn($v) => $v > 2); // 3
Iterables::first(new ArrayIterator([])); // null
Iterables::first(new ArrayIterator([]), else: fn() => false); // false
Diese Methode ist nützlich, um schnell das erste Element einer Sammlung (oder das erste, das eine Bedingung erfüllt) zu erhalten, ohne die gesamte Sammlung manuell durchlaufen zu müssen.
firstKey (iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed
Gibt den Schlüssel des ersten Elements des Iterators zurück. Wenn $predicate
angegeben ist, gibt es den
Schlüssel des ersten Elements zurück, das die angegebene Bedingung erfüllt. Die Funktion $predicate
hat die
Signatur function ($value, $key, iterable $iterable): bool
. Wenn kein passendes Element gefunden wird, wird die
Funktion $else
aufgerufen (falls angegeben) und ihr Ergebnis zurückgegeben. Wenn $else
nicht angegeben
ist, wird null
zurückgegeben.
Iterables::firstKey(new ArrayIterator([1, 2, 3])); // 0
Iterables::firstKey(new ArrayIterator([1, 2, 3]), fn($v) => $v > 2); // 2
Iterables::firstKey(new ArrayIterator(['a' => 1, 'b' => 2])); // 'a'
Iterables::firstKey(new ArrayIterator([])); // null
map (iterable $iterable, callable $transformer): Generator
Erstellt einen neuen Generator durch Anwendung der Funktion $transformer
auf jedes Element des ursprünglichen
Iterators $iterable
. Das $transformer
(Signatur:
function ($value, $key, iterable $iterable): mixed
) gibt den neuen Wert für das Element zurück.
$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::map($iterator, fn($v) => $v * 2);
// 2, 4, 6
Die Methode verwendet einen Generator, was bedeutet, dass die Transformation schrittweise beim Durchlaufen des Ergebnisses erfolgt. Dies ist speichereffizient und ermöglicht die Verarbeitung auch sehr großer Sammlungen. Wenn Sie nicht alle Elemente des resultierenden Iterators durchlaufen, sparen Sie Rechenleistung, da nicht alle Elemente des ursprünglichen Iterators verarbeitet werden.
mapWithKeys (iterable $iterable, callable $transformer): Generator
Erstellt einen neuen Iterator durch Transformation der Werte und Schlüssel des ursprünglichen Iterators. Die Funktion
$transformer
hat die Signatur function ($value, $key, iterable $iterable): ?array{$newKey, $newValue}
.
Wenn $transformer
null
zurückgibt, wird das Element übersprungen. Für beibehaltene Elemente wird das
erste Element des zurückgegebenen Arrays als neuer Schlüssel und das zweite Element als neuer Wert verwendet.
$iterator = new ArrayIterator(['a' => 1, 'b' => 2]);
$iterator = Iterables::mapWithKeys($iterator, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']
Wie map()
verwendet diese Methode einen Generator für die schrittweise Verarbeitung und effiziente
Speicherverwaltung. Dies ermöglicht die Arbeit mit großen Sammlungen und spart Rechenleistung bei teilweisem Durchlauf des
Ergebnisses.
memoize (iterable $iterable): IteratorAggregate
Erstellt einen Wrapper um einen Iterator, der während der Iteration dessen Schlüssel und Werte zwischenspeichert. Dies ermöglicht eine wiederholte Iteration der Daten, ohne die ursprüngliche Datenquelle erneut durchlaufen zu müssen.
$iterator = /* Datenquelle, die nicht mehrmals iteriert werden kann */
$memoized = Iterables::memoize($iterator);
// Jetzt können Sie $memoized mehrmals iterieren, ohne Daten zu verlieren
Diese Methode ist nützlich, wenn derselbe Datensatz mehrmals durchlaufen werden muss, der ursprüngliche Iterator dies jedoch nicht zulässt oder der erneute Durchlauf kostspielig wäre (z.B. beim Lesen aus einer Datenbank oder Datei).
some (iterable $iterable, callable $predicate): bool
Überprüft, ob mindestens ein Element des Iterators die in $predicate
definierte Bedingung erfüllt. Die Funktion
$predicate
hat die Signatur function ($value, $key, iterable $iterable): bool
und muss für mindestens
ein Element true
zurückgeben, damit die Methode some()
true
zurückgibt.
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isEven = fn($value) => $value % 2 === 0;
$res = Iterables::some($iterator, $isEven); // true
Diese Methode ist nützlich zur schnellen Überprüfung, ob in einer Sammlung mindestens ein Element existiert, das eine bestimmte Bedingung erfüllt, beispielsweise ob die Sammlung mindestens eine gerade Zahl enthält.
Gegenstück zu every().
toIterator (iterable $iterable): Iterator
Konvertiert jedes iterierbare Objekt (Array, Traversable) in einen Iterator. Wenn die Eingabe bereits ein Iterator ist, wird sie unverändert zurückgegeben.
$array = [1, 2, 3];
$iterator = Iterables::toIterator($array);
// Jetzt haben Sie einen Iterator anstelle eines Arrays
Diese Methode ist nützlich, wenn Sie sicherstellen müssen, dass Sie einen Iterator zur Verfügung haben, unabhängig vom Typ der Eingabedaten. Dies kann beim Erstellen von Funktionen nützlich sein, die mit verschiedenen Typen iterierbarer Daten arbeiten.