Функції ітератора

Nette\Utils\Iterables статичний клас з функціями для роботи з ітераторами. Його аналогом для масивів є Nette\Utils\Arrays.

Встановлення:

composer require nette/utils

У всіх прикладах передбачається, що створено наступний псевдонім:

use Nette\Utils\Iterables;

contains (iterable $iterable, $value)bool

Шукає задане значення в ітераторі. Використовує строге порівняння (===) для перевірки на збіг. Повертає true, якщо значення знайдено, інакше false.

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

Цей метод корисний, коли вам потрібно швидко визначити, чи присутнє певне значення в ітераторі без ручного перебору всіх елементів.

containsKey (iterable $iterable, $key)bool

Шукає заданий ключ в ітераторі. Використовує строге порівняння (===) для перевірки на збіг. Повертає true, якщо ключ знайдено, інакше 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

Перевіряє, чи всі елементи ітератора задовольняють умову, визначену в $predicate. Функція $predicate має сигнатуру function ($value, $key, iterable $iterable): bool і повинна повертати true для кожного елементу, щоб метод every() повертав true.

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

Цей метод корисний для перевірки того, що всі елементи колекції задовольняють певну умову, наприклад, чи всі числа є меншими за певне значення.

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

Створює новий ітератор, який містить тільки ті елементи з початкового ітератора, які задовольняють умову, визначену в $predicate. Функція $predicate має сигнатуру function ($value, $key, iterable $iterable): bool і повинна повернути true для елементів, які слід зберегти.

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

Метод використовує генератор, що означає, що фільтрація відбувається інкрементно під час ітерації. Це ефективно використовує пам'ять і дозволяє обробляти дуже великі колекції. Якщо ви не перебираєте всі елементи результуючого ітератора, ви економите обчислювальні зусилля, оскільки не всі елементи початкового ітератора обробляються.

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

Повертає перший елемент ітератора. Якщо вказано $predicate, повертається перший елемент, який задовольняє задану умову. Функція $predicate має сигнатуру function ($value, $key, iterable $iterable): bool. Якщо відповідного елемента не знайдено, викликається функція $else (якщо вона задана) і повертається її результат. Якщо $else не задано, повертається 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

Цей метод корисний, коли потрібно швидко отримати перший елемент колекції або перший елемент, який задовольняє певну умову, без ручного перебору всієї колекції.

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

Повертає ключ першого елемента ітератора. Якщо вказано $predicate, повертає ключ першого елемента, який задовольняє задану умову. Функція $predicate має сигнатуру function ($value, $key, iterable $iterable): bool. Якщо відповідного елемента не знайдено, викликається функція $else (якщо вона передбачена) і повертається її результат. Якщо $else не задано, повертається 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

Створює новий ітератор шляхом застосування функції $transformer до кожного елемента початкового ітератора. Функція $transformer має сигнатуру function ($value, $key, iterable $iterable): mixed і її значення, що повертається, використовується як нове значення елемента.

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

Метод використовує генератор, що означає, що перетворення відбувається інкрементно під час ітерації. Це ефективно використовує пам'ять і дозволяє працювати з дуже великими колекціями. Якщо ви не перебираєте всі елементи результуючого ітератора, ви економите обчислювальні зусилля, оскільки не всі елементи початкового ітератора обробляються.

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

Створює новий ітератор шляхом перетворення значень і ключів вихідного ітератора. Функція $transformer має сигнатуру function ($value, $key, iterable $iterable): ?array{$newKey, $newValue}. Якщо $transformer повертає null, елемент пропускається. Для збережених елементів перший елемент повернутого масиву використовується як новий ключ, а другий елемент – як нове значення.

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

Як і map(), цей метод використовує генератор для інкрементної обробки та ефективності використання пам'яті. Це дозволяє працювати з великими колекціями та економити обчислювальні зусилля, обробляючи лише частину результату.

memoize (iterable $iterable): IteratorAggregate

Створює обгортку навколо ітератора, яка кешує його ключі та значення під час ітерації. Це дозволяє повторювати ітерації над даними без необхідності переробляти початкове джерело даних.

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

Цей метод корисний у ситуаціях, коли вам потрібно повторювати один і той самий набір даних кілька разів, але оригінальний ітератор не підтримує повторні ітерації або повторні ітерації були б дорогими (наприклад, читання даних з бази даних або файлу).

some (iterable $iterable, callable $predicate)bool

Перевіряє, чи хоча б один елемент ітератора задовольняє умову, визначену в $predicate. Функція $predicate має сигнатуру function ($value, $key, iterable $iterable): bool і повинна повернути true для хоча б одного елементу, щоб метод some() повернув true.

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

Цей метод корисний для швидкої перевірки, чи є в колекції хоча б один елемент, який задовольняє певній умові, наприклад, чи містить колекція хоча б одне парне число.

Див. опис методу every().

toIterator (iterable $iterable): Iterator

Перетворює будь-який ітерований об'єкт (масив, Traversable) в ітератор. Якщо на вході вже є ітератор, він повертається без змін.

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

Цей метод корисний, коли вам потрібно переконатися, що у вас є ітератор, незалежно від типу вхідних даних. Це може бути корисно при створенні функцій, які працюють з різними типами даних, що повторюються.

версію: 4.0