Delo z iteratorji

Nette\Utils\Iterables je statični razred s funkcijami za delo z iteratorji. Njegova ustreznica za polja je Nette\Utils\Arrays.

Namestitev:

composer require nette/utils

Vsi primeri predpostavljajo ustvarjen alias:

use Nette\Utils\Iterables;

contains (iterable $iterable, $value)bool

Išče podano vrednost v iteratorju. Uporablja strogo primerjavo (===) za preverjanje ujemanja. Vrne true, če je vrednost najdena, sicer false.

Iterables::contains(new ArrayIterator([1, 2, 3]), 1);    // true
Iterables::contains(new ArrayIterator([1, 2, 3]), '1');  // false

Ta metoda je uporabna, ko morate hitro ugotoviti, ali se določena vrednost nahaja v iteratorju, ne da bi morali ročno prehajati skozi vse elemente.

containsKey (iterable $iterable, $key)bool

Išče podani ključ v iteratorju. Uporablja strogo primerjavo (===) za preverjanje ujemanja. Vrne true, če je ključ najden, sicer 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

Preverja, ali vsi elementi iteratorja izpolnjujejo pogoj, definiran v $predicate. Funkcija $predicate ima signaturo function ($value, $key, iterable $iterable): bool in mora vrniti true za vsak element, da metoda every() vrne true.

$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isBelowThreshold = fn($value) => $value < 40;
$res = Iterables::every($iterator, $isBelowThreshold); // true

Ta metoda je uporabna za preverjanje, ali vsi elementi v zbirki izpolnjujejo določen pogoj, na primer, ali so vsa števila manjša od določene vrednosti.

filter (iterable $iterable, callable $predicate): Generator

Ustvari nov iterator, ki vsebuje samo tiste elemente iz izvirnega iteratorja, ki izpolnjujejo pogoj, definiran v $predicate. Funkcija $predicate ima signaturo function ($value, $key, iterable $iterable): bool in mora vrniti true za elemente, ki naj bodo ohranjeni.

$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::filter($iterator, fn($v) => $v < 3);
// 1, 2

Metoda uporablja generator, kar pomeni, da filtriranje poteka postopoma med prehajanjem rezultata. To je učinkovito z vidika pomnilnika in omogoča obdelavo tudi zelo velikih zbirk. Če ne preidete vseh elementov rezultirajočega iteratorja, prihranite računsko moč, saj se ne obdelajo vsi elementi izvirnega iteratorja.

first (iterable $iterable, ?callable $predicate=null, ?callable $else=null)mixed

Vrne prvi element iteratorja. Če je podan $predicate, vrne prvi element, ki izpolnjuje dani pogoj. Funkcija $predicate ima signaturo function ($value, $key, iterable $iterable): bool. Če ni najden noben ustrezen element, se pokliče funkcija $else (če je podana) in vrne se njen rezultat. Če $else ni podan, se vrne null.

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

Ta metoda je uporabna, ko morate hitro pridobiti prvi element zbirke ali prvi element, ki izpolnjuje določen pogoj, ne da bi morali ročno prehajati skozi celotno zbirko.

firstKey (iterable $iterable, ?callable $predicate=null, ?callable $else=null)mixed

Vrne ključ prvega elementa iteratorja. Če je podan $predicate, vrne ključ prvega elementa, ki izpolnjuje dani pogoj. Funkcija $predicate ima signaturo function ($value, $key, iterable $iterable): bool. Če ni najden noben ustrezen element, se pokliče funkcija $else (če je podana) in vrne se njen rezultat. Če $else ni podan, se vrne null.

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

Ustvari nov iterator z uporabo funkcije $transformer na vsakem elementu izvirnega iteratorja. Funkcija $transformer ima signaturo function ($value, $key, iterable $iterable): mixed in njena vrnjena vrednost se uporabi kot nova vrednost elementa.

$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::map($iterator, fn($v) => $v * 2);
// 2, 4, 6

Metoda uporablja generator, kar pomeni, da transformacija poteka postopoma med prehajanjem rezultata. To je učinkovito z vidika pomnilnika in omogoča obdelavo tudi zelo velikih zbirk. Če ne preidete vseh elementov rezultirajočega iteratorja, prihranite računsko moč, saj se ne obdelajo vsi elementi izvirnega iteratorja.

mapWithKeys (iterable $iterable, callable $transformer): Generator

Ustvari nov iterator s transformacijo vrednosti in ključev izvirnega iteratorja. Funkcija $transformer ima signaturo function ($value, $key, iterable $iterable): ?array{$newKey, $newValue}. Če $transformer vrne null, je element preskočen. Za ohranjene elemente se prvi element vrnjenega polja uporabi kot nov ključ, drugi element pa kot nova vrednost.

$iterator = new ArrayIterator(['a' => 1, 'b' => 2]);
$iterator = Iterables::mapWithKeys($iterator, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']

Tako kot map(), ta metoda uporablja generator za postopno obdelavo in učinkovito delo s pomnilnikom. To omogoča delo z velikimi zbirkami in prihranek računske moči pri delnem prehodu rezultata.

memoize (iterable $iterable): IteratorAggregate

Ustvari ovoj okoli iteratorja, ki med iteracijo shranjuje njegove ključe in vrednosti v predpomnilnik. To omogoča ponovno iteracijo podatkov brez potrebe po ponovnem prehodu izvirnega vira podatkov.

$iterator = /* data, která nelze iterovat vícekrát */
$memoized = Iterables::memoize($iterator);
// Nyní můžete iterovat $memoized vícekrát bez ztráty dat

Ta metoda je uporabna v situacijah, ko morate večkrat preiti isti nabor podatkov, vendar izvirni iterator ne omogoča ponovne iteracije ali pa bi bilo ponovno prehajanje drago (npr. pri branju podatkov iz podatkovne baze ali datoteke).

some (iterable $iterable, callable $predicate)bool

Preverja, ali vsaj en element iteratorja izpolnjuje pogoj, definiran v $predicate. Funkcija $predicate ima signaturo function ($value, $key, iterable $iterable): bool in mora vrniti true za vsaj en element, da metoda some() vrne true.

$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isEven = fn($value) => $value % 2 === 0;
$res = Iterables::some($iterator, $isEven); // true

Ta metoda je uporabna za hitro preverjanje, ali v zbirki obstaja vsaj en element, ki izpolnjuje določen pogoj, na primer, ali zbirka vsebuje vsaj eno sodo število.

Glejte every().

toIterator (iterable $iterable): Iterator

Pretvori kateri koli iterabilni objekt (array, Traversable) v Iterator. Če je vhod že Iterator, ga vrne nespremenjenega.

$array = [1, 2, 3];
$iterator = Iterables::toIterator($array);
// Nyní máte Iterator místo pole

Ta metoda je uporabna, ko morate zagotoviti, da imate na voljo Iterator, ne glede na vrsto vhodnih podatkov. To je lahko uporabno pri ustvarjanju funkcij, ki delajo z različnimi vrstami iterabilnih podatkov.

različica: 4.0