Funções de iterador

Nette\Utils\Iterables é uma classe estática com funções para trabalhar com iteradores. Sua contraparte para matrizes é Nette\Utils\Arrays.

Instalação:

composer require nette/utils

Todos os exemplos pressupõem que o alias a seguir foi criado:

use Nette\Utils\Iterables;

contains (iterable $iterable, $value)bool

Procura por um determinado valor em um iterador. Usa comparação rigorosa (===) para verificar se há correspondência. Retorna true se o valor for encontrado, caso contrário, false.

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

Esse método é útil quando você precisa determinar rapidamente se um valor específico está presente em um iterador sem iterar manualmente por todos os elementos.

containsKey (iterable $iterable, $key)bool

Procura por uma determinada chave em um iterador. Usa comparação rigorosa (===) para verificar se há correspondência. Retorna true se a chave for encontrada, caso contrário, 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

Verifica se todos os elementos do iterador satisfazem a condição definida em $predicate. A função $predicate tem a assinatura function ($value, $key, iterable $iterable): bool e deve retornar true para cada elemento para que o método every() retorne true.

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

Esse método é útil para verificar se todos os elementos de uma coleção atendem a uma determinada condição, como, por exemplo, se todos os números estão abaixo de um valor específico.

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

Cria um novo iterador que contém somente os elementos do iterador original que satisfazem a condição definida em $predicate. A função $predicate tem a assinatura function ($value, $key, iterable $iterable): bool e deve retornar true para os elementos que devem ser mantidos.

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

O método usa um gerador, o que significa que a filtragem ocorre de forma incremental durante a iteração. Isso é eficiente em termos de memória e permite lidar com coleções muito grandes. Se você não iterar por todos os elementos do iterador resultante, economizará esforço computacional, pois nem todos os elementos do iterador original serão processados.

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

Retorna o primeiro elemento do iterador. Se $predicate for fornecido, ele retornará o primeiro elemento que satisfaz a condição fornecida. A função $predicate tem a assinatura function ($value, $key, iterable $iterable): bool. Se nenhum elemento correspondente for encontrado, a função $else (se fornecida) será chamada e seu resultado será retornado. Se $else não for fornecido, null será retornado.

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

Esse método é útil quando você precisa recuperar rapidamente o primeiro elemento de uma coleção ou o primeiro elemento que atende a uma determinada condição sem iterar manualmente por toda a coleção.

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

Retorna a chave do primeiro elemento do iterador. Se $predicate for fornecido, ele retornará a chave do primeiro elemento que satisfaz a condição fornecida. A função $predicate tem a assinatura function ($value, $key, iterable $iterable): bool. Se nenhum elemento correspondente for encontrado, a função $else (se fornecida) será chamada e seu resultado será retornado. Se $else não for fornecido, null será retornado.

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

Cria um novo iterador aplicando a função $transformer a cada elemento do iterador original. A função $transformer tem a assinatura function ($value, $key, iterable $iterable): mixed e seu valor de retorno é usado como o novo valor do elemento.

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

O método usa um gerador, o que significa que a transformação ocorre de forma incremental durante a iteração. Isso é eficiente em termos de memória e permite lidar com coleções muito grandes. Se você não iterar por todos os elementos do iterador resultante, economizará esforço computacional, pois nem todos os elementos do iterador original serão processados.

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

Cria um novo iterador transformando os valores e as chaves do iterador original. A função $transformer tem a assinatura function ($value, $key, iterable $iterable): ?array{$newKey, $newValue}. Se $transformer retornar null, o elemento será ignorado. Para elementos retidos, o primeiro elemento da matriz retornada é usado como a nova chave e o segundo elemento como o novo valor.

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

Assim como o map(), esse método usa um gerador para processamento incremental e eficiência de memória. Isso permite trabalhar com grandes coleções e economizar esforço computacional ao processar apenas parte do resultado.

memoize (iterable $iterable): IteratorAggregate

Cria um invólucro em torno de um iterador que armazena em cache suas chaves e valores durante a iteração. Isso permite a iteração repetida dos dados sem a necessidade de reprocessar a fonte de dados original.

$iterator = /* data that cannot be iterated multiple times */
$memoized = Iterables::memoize($iterator);
// Now you can iterate $memoized multiple times without data loss

Esse método é útil em situações em que você precisa iterar sobre o mesmo conjunto de dados várias vezes, mas o iterador original não oferece suporte à iteração repetida ou a iteração repetida seria dispendiosa (por exemplo, ler dados de um banco de dados ou arquivo).

some (iterable $iterable, callable $predicate)bool

Verifica se pelo menos um elemento do iterador satisfaz a condição definida em $predicate. A função $predicate tem a assinatura function ($value, $key, iterable $iterable): bool e deve retornar true para pelo menos um elemento para que o método some() retorne true.

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

Esse método é útil para verificar rapidamente se há pelo menos um elemento em uma coleção que atenda a uma determinada condição, como, por exemplo, se a coleção contém pelo menos um número par.

Consulte every().

toIterator (iterable $iterable): Iterator

Converte qualquer objeto iterável (matriz, Traversable) em um Iterator. Se a entrada já for um Iterator, ela será retornada inalterada.

$array = [1, 2, 3];
$iterator = Iterables::toIterator($array);
// Now you have an Iterator instead of an array

Esse método é útil quando você precisa garantir que tem um Iterator, independentemente do tipo de dados de entrada. Isso pode ser útil ao criar funções que funcionam com diferentes tipos de dados iteráveis.

versão: 4.0