README.md

July 26, 2026 · View on GitHub

IterToolsLogo Logo

IterTools PHP — инструментарий для работы с итерируемыми сущностями

Спроектирован для PHP аналогично itertools в Python.

Coverage Status License

Функционал

IterTools поддерживает два вида конструкций для итерирования:

  • Итерирование в цикле
  • Итерирование в потоке цепочечных вызовов

Пример итерирования в цикле

foreach (Multi::zip(['a', 'b'], [1, 2]) as [$letter, $number]) {
    print($letter . $number);  // a1, b2
}

Пример итерирования в потоке цепочечных вызовов

$result = Stream::of([1, 1, 2, 2, 3, 4, 5])
    ->distinct()                 // [1, 2, 3, 4, 5]
    ->map(fn ($x) => $x**2)      // [1, 4, 9, 16, 25]
    ->filter(fn ($x) => $x < 10) // [1, 4, 9]
    ->toSum();                   // 14

Методы библиотеки гарантировано работают с любыми iterable сущностями:

  • array
  • Iterator
  • Generator
  • Traversable

Установка

Добавьте библиотеку в зависимости в файле composer.json вашего проекта:

{
  "require": {
      "markrogoyski/itertools-php": "2.*"
  }
}

Используйте composer, чтобы установить библиотеку:

$ composer install

Composer установит IterTools в папку vendor вашего проекта. После этого вы можете использовать функционал библиотеки в файлах своего проекта, используя Composer Autoloader.

require_once __DIR__ . '/vendor/autoload.php';

Альтернативный вариант установки. Выполните данную команду в терминале, находясь в корневой директории вашего проекта:

$ composer require markrogoyski/itertools-php:2.*

Минимальные требования

  • PHP 8.2+
    • (Для PHP 7.4–8.1 используйте v1.9)

Краткий справочник

Инструменты для итерирования в циклах

Итерирование нескольких коллекций

МетодОписаниеПример кода
chainПоследовательно итерирует коллекцииMulti::chain($list1, $list2)
roundRobinПоочерёдно отдаёт по одному элементу из каждой коллекции, чередуя источникиMulti::roundRobin($list1, $list2)
zipПараллельно итерирует коллекции, пока не закончится самый короткий итераторMulti::zip($list1, $list2)
zipEqualПараллельно итерирует коллекции одного размера, в случае разных размеров бросает исключениеMulti::zipEqual($list1, $list2)
zipFilledПараллельно итерирует коллекции с подстановкой филлера для закончившихся итераторовMulti::zipFilled($default, $list1, $list2)
zipLongestПараллельно итерирует коллекции, пока не закончится самый длинный итераторMulti::zipLongest($list1, $list2)
unzipТранспонирует последовательность строк в столбцы (обратная операция к zip)Multi::unzip($rows)

Итерирование одной коллекции

МетодОписаниеПример кода
accumulateНакапливает результат применения бинарного оператораSingle::accumulate($data, $op, [$initial])
chunkwiseИтерирует коллекцию, разбитую на чанкиSingle::chunkwise($data, $chunkSize)
chunkwiseOverlapИтерирует коллекцию, разбитую на взаимонакладывающиеся чанкиSingle::chunkwiseOverlap($data, $chunkSize, $overlapSize)
compressВозвращает элементы из коллекции, выбранные селекторомSingle::compress($data, $selectors)
compressAssociativeВозвращает элементы из коллекции по заданным ключамSingle::compressAssociative($data, $selectorKeys)
dropLastПеребирает все элементы, кроме последних NSingle::dropLast($data, $count)
dropWhileПропускает элементы, пока предикат возвращает истинуSingle::dropWhile($data, $predicate)
enumerateИтерирует пары [индекс, значение]Single::enumerate($data, [$start])
filterВозвращает только те элементы, для которых предикат возвращает истинуSingle::filter($data, $predicate)
filterTrueВозвращает только истинные элементы из коллекцииSingle::filterTrue($data)
filterFalseВозвращает только ложные элементы из коллекцииSingle::filterFalse($data, $predicate)
filterKeysВозвращает только те элементы, для ключей которых предикат возвращает истинуSingle::filterKeys($data, $predicate)
filterWithKeysФильтрация предикатом, учитывающим значение и ключSingle::filterWithKeys($data, $predicate)
flatMapОтображение коллекции с уплощением результата на 1 уровень вложенностиSingle::flatMap($data, $mapper)
flatMapWithKeysОтображение, учитывающее ключи, с уплощением результатаSingle::flatMapWithKeys($data, $func)
flattenМногоуровневое уплощение коллекцииSingle::flatten($data, [$dimensions])
groupAdjacentByГруппирует подряд идущие элементы по извлечённому ключуSingle::groupAdjacentBy($data, $keyFn)
groupByГруппирует элементы коллекцииSingle::groupBy($data, $groupKeyFunction, [$itemKeyFunc])
intersperseВставляет разделитель между элементами коллекцииSingle::intersperse($data, $separator)
limitОграничивает итерирование коллекции заданным максимальным числом итерацийSingle::limit($data, $limit)
mapОтображение коллекции с использованием callback-функцииSingle::map($data, $function)
mapWithKeysОтображение функцией, учитывающей значение и ключSingle::mapWithKeys($data, $func)
mapSpreadОтображение, при котором элементы распаковываются как позиционные аргументыSingle::mapSpread($data, $function)
padLeftДополняет коллекцию слева до указанной минимальной длиныSingle::padLeft($data, $length, $fill)
padRightДополняет коллекцию справа до указанной минимальной длиныSingle::padRight($data, $length, $fill)
pairwiseИтерирует коллекцию попарно (с наложением)Single::pairwise($data)
rangeЛениво генерирует конечную арифметическую прогрессию чиселSingle::range($start, $end, [$step])
reindexПереиндексирует key-value коллекциюSingle::reindex($data, $reindexer)
repeatПовторяет данное значение заданное число разSingle::repeat($item, $repetitions)
reverseИтерирует коллекцию в обратном порядкеSingle::reverse($data)
skipИтерирует коллекцию, пропуская некоторое количество элементов подрядSingle::skip($data, $count, [$offset])
sliceВозвращает подвыборку коллекцииSingle::slice($data, [$start], [$count], [$step])
splitWhenРазбивает коллекцию на группы при срабатывании предикатаSingle::splitWhen($data, $predicate)
stringИтерирует строку посимвольноSingle::string($string)
takeLastПеребирает последние N элементовSingle::takeLast($data, $count)
takeWhileОтдает элементы, пока предикат возвращает истинуSingle::takeWhile($data, $predicate)
windowedИтерирует скользящие окна элементовSingle::windowed($data, $size, [$step], [$partial])
withFirstСопоставляет каждому элементу флаг «первый»Single::withFirst($data)
withFirstAndLastСопоставляет каждому элементу флаги «первый»/«последний»Single::withFirstAndLast($data)
withLastСопоставляет каждому элементу флаг «последний»Single::withLast($data)

Бесконечное итерирование

МетодОписаниеПример кода
countБесконечно перебирает последовательность целых чиселInfinite::count($start, $step)
cycleБесконечно зацикливает перебор коллекцииInfinite::cycle($collection)
generateБесконечно отдаёт значения, возвращаемые поставщикомInfinite::generate($supplier)
iterateБесконечно применяет функцию к её предыдущему результатуInfinite::iterate($initial, $function)
repeatБесконечно повторяет данное значениеInfinite::repeat($item)

Итерирование случайных значений

МетодОписаниеПример кода
choiceСлучайные выборы вариантов из спискаRandom::choice($list, $repetitions)
coinFlipСлучайные броски монеты (0 или 1)Random::coinFlip($repetitions)
numberСлучайные целые числаRandom::number($min, $max, $repetitions)
percentageСлучайные вещественные числа между 0 и 1Random::percentage($repetitions)
reservoirSampleОднопроходная равномерная случайная выборкаRandom::reservoirSample($data, $size, [$engine])
rockPaperScissorsСлучайный выбор "камень-ножницы-бумага"Random::rockPaperScissors($repetitions)
sampleСлучайная выборка без повторенийRandom::sample($data, $size, [$engine])

Математическое итерирование

МетодОписаниеПример кода
frequenciesАбсолютное распределение частотMath::frequencies($data, [$strict])
frequenciesByРаспределение частот по функции-ключуMath::frequenciesBy($data, $keyFunc, [$strict])
relativeFrequenciesОтносительное распределение частотMath::relativeFrequencies($data, [$strict])
relativeFrequenciesByОтносительное распределение частот по функции-ключуMath::relativeFrequenciesBy($data, $keyFunc, [$strict])
runningAverageНакопление среднего арифметическогоMath::runningAverage($numbers, $initialValue)
runningDifferenceНакопление разностиMath::runningDifference($numbers, $initialValue)
runningMaxПоиск максимального значенияMath::runningMax($numbers, $initialValue)
runningMinПоиск минимального значенияMath::runningMin($numbers, $initialValue)
runningProductНакопление произведенияMath::runningProduct($numbers, $initialValue)
runningTotalНакопление суммыMath::runningTotal($numbers, $initialValue)

Итерирование множеств и мультимножеств

МетодОписаниеПример кода
distinctФильтрует коллекцию, сохраняя только уникальные значенияSet::distinct($data)
distinctAdjacentУдаляет только подряд идущие дубликатыSet::distinctAdjacent($data)
distinctAdjacentByУдаляет только подряд идущие дубликаты по заданному ключуSet::distinctAdjacentBy($data, $keyFn)
distinctByФильтрует коллекцию, сохраняя только уникальные значения по компараторуSet::distinctBy($data, $compareBy)
duplicatesВозвращает значения, встречающиеся более одного разаSet::duplicates($data, [$strict])
duplicatesByВозвращает дубликаты по извлечённому ключуSet::duplicatesBy($data, $keyFn)
intersectionПересечение нескольких коллекцийSet::intersection(...$iterables)
intersectionCoerciveПересечение нескольких коллекций в режиме приведения типовSet::intersectionCoercive(...$iterables)
partialIntersectionЧастичное пересечение нескольких коллекцийSet::partialIntersection($minCount, ...$iterables)
partialIntersectionCoerciveЧастичное пересечение нескольких коллекций в режиме приведения типовSet::partialIntersectionCoercive($minCount, ...$iterables)
differenceРазность коллекцийSet::difference($a, ...$iterables)
differenceCoerciveРазность коллекций в режиме приведения типовSet::differenceCoercive($a, ...$iterables)
symmetricDifferenceСимметрическая разница нескольких коллекцийSet::symmetricDifference(...$iterables)
symmetricDifferenceCoerciveСимметрическая разница нескольких коллекций в режиме приведения типовSet::symmetricDifferenceCoercive(...$iterables)
unionОбъединение нескольких коллекцийSet::union(...$iterables)
unionCoerciveОбъединение нескольких коллекций в режиме приведения типовSet::unionCoercive(...$iterables)

Комбинаторное итерирование

МетодОписаниеПример кода
productДекартово произведение коллекцийCombinatorics::product(...$iterables)
permutationsПерестановки элементов коллекцииCombinatorics::permutations($data, [$r])
combinationsСочетания элементов коллекцииCombinatorics::combinations($data, $r)
combinationsWithReplacementСочетания с повторениямиCombinatorics::combinationsWithReplacement($data, $r)
powersetВсе подмножества коллекции (булеан)Combinatorics::powerset($data)

Итерирование с сортировкой

ИтераторОписаниеПример кода
asortСортирует коллекцию с сохранением ключейSort::asort($data, [$comparator])
asortByСортирует коллекцию по извлечённому ключу с сохранением ключейSort::asortBy($data, $keyFn)
largestn наибольших элементов (по убыванию)Sort::largest($data, $n, [$keyFn])
shuffleИтерирует коллекцию в случайном порядкеSort::shuffle($data, [$engine])
smallestn наименьших элементов (по возрастанию)Sort::smallest($data, $n, [$keyFn])
sortСортирует коллекциюSort::sort($data, [$comparator])
sortByСортирует коллекцию по извлечённому ключуSort::sortBy($data, $keyFn)

Итерирование файлов

ИтераторОписаниеПример кода
readCsvИтерирует коллекции ячеек CSV-файла построчноFile::readCsv($fileHandle)
readCsvAssocИтерирует CSV-файл как массивы с ключами из заголовковFile::readCsvAssoc($fileHandle)
readLinesИтерирует содержимое файла построчноFile::readLines($fileHandle)
writeCsvЗаписывает коллекцию строк в файл в формате CSVFile::writeCsv($fileHandle, $rows, $header)
writeLinesЗаписывает коллекцию строк в файлFile::writeLines($fileHandle, $lines)

Преобразование итерируемых сущностей

ИтераторОписаниеПример кода
partitionРазделяет коллекцию на два списка: истинные и ложныеTransform::partition($data, $predicate)
teeСоздает несколько одинаковых независимых итераторов из данной коллекцииTransform::tee($data, $count)
toArrayПреобразует итерируемую коллекцию в массивTransform::toArray($data)
toAssociativeArrayПреобразует итерируемую коллекцию в ассоциативный массивTransform::toAssociativeArray($data, [$keyFunc], [$valueFunc])
toIteratorПреобразует итерируемую коллекцию в итераторTransform::toIterator($data)

Саммари о коллекции

МетодОписаниеПример кода
allMatchИстинно, если предикат возвращает истину для всех элементов коллекцииSummary::allMatch($data, $predicate)
allUniqueИстинно, если все элементы коллекции уникальныSummary::allUnique($data, [$strict])
anyMatchИстинно, если предикат возвращает истину хотя бы для одного элемента коллекцииSummary::anyMatch($data, $predicate)
arePermutationsИстинно, если коллекции являются перестановками друг другаSummary::arePermutations(...$iterables)
arePermutationsCoerciveИстинно, если коллекции являются перестановками друг друга (в режиме приведения типов)Summary::arePermutationsCoercive(...$iterables)
atLeastNИстинно, если предикат возвращает истину как минимум для N элементовSummary::atLeastN($data, $n, [$predicate])
atMostNИстинно, если предикат возвращает истину не более чем для N элементовSummary::atMostN($data, $n, [$predicate])
containsИстинно, если коллекция содержит искомое значениеSummary::contains($data, $needle)
containsCoerciveИстинно, если коллекция содержит искомое значение (в режиме приведения типов)Summary::containsCoercive($data, $needle)
endsWithИстинно, если коллекция заканчивается заданным суффиксомSummary::endsWith($data, $suffix)
endsWithCoerciveИстинно, если коллекция заканчивается заданным суффиксом (в режиме приведения типов)Summary::endsWithCoercive($data, $suffix)
exactlyNИстинно, если предикат возвращает истину в точности для N элементовSummary::exactlyN($data, $n, $predicate)
isPartitionedИстинно, если истинные элементы находятся в коллекции перед ложными (истинность определяет предикат)Summary::isPartitioned($data, $predicate)
isEmptyИстинно, если коллекция пустаSummary::isEmpty($data)
isSortedИстинно, если коллекция отсортирована в прямом порядкеSummary::isSorted($data)
isReversedИстинно, если коллекция отсортирована в обратном порядкеSummary::isReversed($data)
isSortedByИстинно, если коллекция отсортирована по функции-ключу в прямом порядкеSummary::isSortedBy($data, $keyFunc)
isReversedByИстинно, если коллекция отсортирована по функции-ключу в обратном порядкеSummary::isReversedBy($data, $keyFunc)
noneMatchИстинно, если предикат возвращает ложь для всех элементов коллекцииSummary::noneMatch($data, $predicate)
sameИстинно, если данные коллекции одинаковыSummary::same(...$iterables)
sameCountИстинно, если данные коллекции имеют одинаковую длинуSummary::sameCount(...$iterables)
startsWithИстинно, если коллекция начинается с заданного префиксаSummary::startsWith($data, $prefix)
startsWithCoerciveИстинно, если коллекция начинается с заданного префикса (в режиме приведения типов)Summary::startsWithCoercive($data, $prefix)

Редуцирование

МетодОписаниеПример кода
toAverageСреднее арифметическое элементов коллекцииReduce::toAverage($numbers)
toCountДлина коллекцииReduce::toCount($data)
toCountByКоличества, сгруппированные по функции-ключуReduce::toCountBy($data, $keyFunc)
toFirstПервый элемент коллекцииReduce::toFirst()
toFirstAndLastПервый и последний элементы коллекцииReduce::toFirstAndLast()
toFirstMatchПервый элемент, удовлетворяющий предикатуReduce::toFirstMatch($data, $predicate, [$default])
toFirstMatchIndexИндекс первого элемента, удовлетворяющего предикатуReduce::toFirstMatchIndex($data, $predicate, [$default])
toFirstMatchKeyКлюч первого элемента, удовлетворяющего предикатуReduce::toFirstMatchKey($data, $predicate, [$default])
toLastПоследний элемент коллекцииReduce::toLast()
toLastMatchПоследний элемент, удовлетворяющий предикатуReduce::toLastMatch($data, $predicate, [$default])
toLastMatchIndexИндекс последнего элемента, удовлетворяющего предикатуReduce::toLastMatchIndex($data, $predicate, [$default])
toLastMatchKeyКлюч последнего элемента, удовлетворяющего предикатуReduce::toLastMatchKey($data, $predicate, [$default])
toOnlyЕдинственный элемент коллекцииReduce::toOnly($data)
consumeПолный обход коллекции с отбрасыванием значенийReduce::consume($data)
toMaxМаксимальный элемент коллекцииReduce::toMax($numbers, [$compareBy])
toMinМинимальный элемент коллекцииReduce::toMin($numbers, [$compareBy])
toMinMaxМинимальный и максимальный элемент коллекцииReduce::toMinMax($numbers, [$compareBy])
toMedianМедиана коллекцииReduce::toMedian($numbers)
toModeСписок мод коллекции (наиболее частых значений)Reduce::toMode($data)
toVarianceДисперсия (генеральная/выборочная)Reduce::toVariance($numbers, [$sample])
toStandardDeviationСтандартное отклонение (генеральное/выборочное)Reduce::toStandardDeviation($numbers, [$sample])
toPercentileЗначение коллекции для заданного процентиля [0, 100]Reduce::toPercentile($numbers, $percentile)
toQuantileЗначение коллекции для заданного квантиля [0, 1]Reduce::toQuantile($numbers, $quantile)
toNthN-й элемент коллекцииReduce::toNth($data, $position)
toProductПроизведение элементов коллекцииReduce::toProduct($numbers)
toRandomValueСлучайный элемент из коллекцииReduce::toRandomValue($data)
toRangeРазница между максимальным и минимальным элементами коллекцииReduce::toRange($numbers)
toStringПреобразование коллекции в строкуReduce::toString($data, [$separator], [$prefix], [$suffix])
toSumСумма элементов коллекцииReduce::toSum($numbers)
toValueРедуцирование коллекции до значения, вычисляемого с использованием callback-функцииReduce::toValue($data, $reducer, $initialValue)

Цепочечный вызов итераторов

Фабричные методы

ИсточникОписаниеПример кода
ofСоздает поток для цепочечных вызовов из данной коллекцииStream::of($iterable)
ofCoinFlipsСоздает поток для цепочечных вызовов из бесконечных случайных бросков монетыStream::ofCoinFlips($repetitions)
ofCsvFileСоздает поток для цепочечных вызовов из строк CSV-файлаStream::ofCsvFile($fileHandle)
ofCsvFileAssocСоздает поток из строк CSV-файла с ключами из заголовковStream::ofCsvFileAssoc($fileHandle)
ofFileLinesСоздает поток для цепочечных вызовов из строк файлаStream::ofFileLines($fileHandle)
ofEmptyСоздает поток для цепочечных вызовов из пустой коллекцииStream::ofEmpty()
ofRandomChoiceСоздает поток для цепочечных вызовов из бесконечных случайных выборов элемента из спискаStream::ofRandomChoice($items, $repetitions)
ofRandomNumbersСоздает поток для цепочечных вызовов из бесконечного набора случайных целых чиселStream::ofRandomNumbers($min, $max, $repetitions)
ofRandomPercentageСоздает поток для цепочечных вызовов из бесконечного набора случайных вещественных чисел между 0 и 1Stream::ofRandomPercentage($repetitions)
ofRangeСоздает ленивый поток конечной арифметической прогрессии чиселStream::ofRange($start, $end, $step)
ofRockPaperScissorsСоздает поток для цепочечных вызовов из бесконечных случайных выборов "камень-ножницы-бумага"Stream::ofRockPaperScissors($repetitions)

Цепочечные операции

ОперацияОписаниеПример кода
accumulateНакапливает результат применения бинарного оператора$stream->accumulate($op, [$initial])
appendДобавляет значения в конец потока$stream->append(...$values)
asortСортирует коллекцию с сохранением ключей$stream->asort([$comparator])
asortByСортирует коллекцию по извлечённому ключу с сохранением ключей$stream->asortBy($keyFn)
chainWithДобавляет в конец итератора другие коллекции для последовательного итерирования$stream->chainWith(...$iterables)
compressОтфильтровывает из коллекции элементы, которые не выбраны$stream->compress($selectors)
compressAssociativeОставляет элементы с выбранными ключами$stream->compressAssociative($selectorKeys)
chunkwiseИтерирует коллекцию с разбиением по чанкам$stream->chunkwise($chunkSize)
chunkwiseOverlapИтерирует коллекцию с разбиением по взаимонакладывающимся чанкам$stream->chunkwiseOverlap($chunkSize, $overlap)
distinctФильтрует коллекцию, сохраняя только уникальные значения$stream->distinct($strict)
distinctAdjacentУдаляет только подряд идущие дубликаты$stream->distinctAdjacent()
distinctAdjacentByУдаляет только подряд идущие дубликаты по заданному ключу$stream->distinctAdjacentBy($keyFn)
distinctByФильтрует коллекцию, сохраняя только уникальные значения по компаратору$stream->distinctBy($compareBy)
dropLastПеребирает все элементы потока, кроме последних N$stream->dropLast($count)
dropWhileПропускает элементы из коллекции, пока предикат возвращает истину$stream->dropWhile($predicate)
duplicatesВозвращает значения, встречающиеся более одного раза$stream->duplicates([$strict])
duplicatesByВозвращает дубликаты по извлечённому ключу$stream->duplicatesBy($keyFn)
enumerateИтерирует пары [индекс, значение]$stream->enumerate([$start])
filterВозвращает из коллекции только те элементы, для которых предикат возвращает истину$stream->filter($predicate)
filterTrueВозвращает только истинные элементы из коллекции$stream->filterTrue($predicate)
filterFalseВозвращает только ложные элементы из коллекции$stream->filterFalse($predicate)
filterKeysВозвращает только те элементы, для ключей которых предикат возвращает истину$stream->filterKeys($predicate)
filterWithKeysФильтрация предикатом, учитывающим значение и ключ$stream->filterWithKeys($predicate)
flatMapОтображение коллекции с уплощением результата на 1 уровень вложенности$stream->flatMap($function)
flatMapWithKeysОтображение, учитывающее ключи, с уплощением результата$stream->flatMapWithKeys($func)
flattenМногоуровневое уплощение коллекции$stream->flatten($dimensions)
frequenciesАбсолютная частота вхождений$stream->frequencies([$strict])
frequenciesByЧастота вхождений по функции-ключу$stream->frequenciesBy($keyFunc, [$strict])
groupAdjacentByГруппирует подряд идущие элементы по извлечённому ключу$stream->groupAdjacentBy($keyFn)
groupByГруппирует элементы из коллекции по заданному правилу$stream->groupBy($groupKeyFunction)
infiniteCycleБесконечно зацикливает перебор коллекции$stream->infiniteCycle()
intersectionWithВозвращает пересечение хранимой коллекции с другими коллекциями$stream->intersectionWith(...$iterables)
intersectionCoerciveWithВозвращает пересечение хранимой коллекции с другими коллекциями (в режиме приведения типов)$stream->intersectionCoerciveWith(...$iterables)
intersperseВставляет разделитель между элементами коллекции$stream->intersperse($separator)
largestСводит поток к n наибольшим элементам (по убыванию)$stream->largest($n, [$keyFn])
limitОграничивает итерирование коллекции заданным максимальным числом итераций$stream->limit($limit)
mapОтображение коллекции с использованием callback-функции$stream->map($function)
mapWithKeysОтображение функцией, учитывающей значение и ключ$stream->mapWithKeys($func)
mapSpreadОтображение, при котором элементы распаковываются как позиционные аргументы$stream->mapSpread($function)
padLeftДополняет поток слева до указанной минимальной длины$stream->padLeft($length, $fill)
padRightДополняет поток справа до указанной минимальной длины$stream->padRight($length, $fill)
pairwiseИтерирует коллекцию попарно (с наложением)$stream->pairwise()
partialIntersectionWithВозвращает частичное пересечение хранимой коллекции с другими коллекциями$stream->partialIntersectionWith( $minIntersectionCount, ...$iterables)
partialIntersectionCoerciveWithВозвращает частичное пересечение хранимой коллекции с другими коллекциями (в режиме приведения типов)$stream->partialIntersectionCoerciveWith( $minIntersectionCount, ...$iterables)
productWithДекартово произведение коллекции с другими коллекциями$stream->productWith(...$iterables)
permutationsПерестановки элементов коллекции$stream->permutations([$r])
combinationsСочетания элементов коллекции$stream->combinations($r)
combinationsWithReplacementСочетания с повторениями элементов потока$stream->combinationsWithReplacement($r)
powersetВсе подмножества элементов потока (булеан)$stream->powerset()
prependДобавляет значения в начало потока$stream->prepend(...$values)
reindexПереиндексирует key-value коллекцию$stream->reindex($reindexer)
relativeFrequenciesОтносительная частота вхождений$stream->relativeFrequencies([$strict])
relativeFrequenciesByОтносительная частота вхождений по функции-ключу$stream->relativeFrequenciesBy($keyFunc, [$strict])
reservoirSampleОднопроходная равномерная случайная выборка (энергичная)$stream->reservoirSample($size, [$engine])
reverseИтерирует коллекцию в обратном порядке$stream->reverse()
roundRobinWithПоочерёдно отдаёт элементы из потока и заданных коллекций, чередуя источники$stream->roundRobinWith(...$iterables)
runningAverageНакопление среднего арифметического элементов коллекции$stream->runningAverage($initialValue)
runningDifferenceНакопление разности элементов коллекции$stream->runningDifference($initialValue)
runningMaxПоиск максимального значения из коллекции$stream->runningMax($initialValue)
runningMinПоиск минимального значения из коллекции$stream->runningMin($initialValue)
runningProductНакопление произведения элементов коллекции$stream->runningProduct($initialValue)
runningTotalНакопление суммы элементов коллекции$stream->runningTotal($initialValue)
sampleСлучайная выборка из $size элементов потока без повторений$stream->sample($size, [$engine])
shuffleРандомизирует порядок элементов потока$stream->shuffle([$engine])
skipПропускает n элементов коллекции$stream->skip($count, [$offset])
sliceВозвращает подвыборку коллекции$stream->slice([start], [$count], [step])
smallestСводит поток к n наименьшим элементам (по возрастанию)$stream->smallest($n, [$keyFn])
sortСортирует хранимую коллекцию$stream->sort([$comparator])
sortByСортирует хранимую коллекцию по извлечённому ключу$stream->sortBy($keyFn)
splitWhenРазбивает поток на группы при срабатывании предиката$stream->splitWhen($predicate)
differenceWithВозвращает разность хранимой коллекции с другими коллекциями$stream->differenceWith(...$iterables)
differenceCoerciveWithВозвращает разность хранимой коллекции с другими коллекциями (в режиме приведения типов)$stream->differenceCoerciveWith(...$iterables)
symmetricDifferenceWithВозвращает симметрическую разность хранимой коллекции с другими коллекциями$this->symmetricDifferenceWith(...$iterables)
symmetricDifferenceCoerciveWithВозвращает симметрическую разность хранимой коллекции с другими коллекциями (в режиме приведения типов)$this->symmetricDifferenceCoerciveWith( ...$iterables)
takeLastПеребирает последние N элементов потока$stream->takeLast($count)
takeWhileОтдает элементы из коллекции, пока предикат возвращает истину$stream->takeWhile($predicate)
unionWithВозвращает объединение хранимой коллекции с другими коллекциями$stream->unionWith(...$iterables)
unionCoerciveWithВозвращает объединение хранимой коллекции с другими коллекциями (в режиме приведения типов)$stream->unionCoerciveWith(...$iterables)
unzipТранспонирует строки потока в столбцы (обратная операция к zip)$stream->unzip()
windowedИтерирует скользящие окна элементов$stream->windowed($size, [$step], [$partial])
withFirstСопоставляет каждому элементу флаг «первый»$stream->withFirst()
withFirstAndLastСопоставляет каждому элементу флаги «первый»/«последний»$stream->withFirstAndLast()
withLastСопоставляет каждому элементу флаг «последний»$stream->withLast()
zipТранспонирует поток строк по столбцам, останавливаясь по самой короткой строке$stream->zip()
zipLongestТранспонирует поток строк по столбцам до самой длинной строки (отсутствующие → null)$stream->zipLongest()
zipFilledТранспонирует поток строк по столбцам до самой длинной, подставляя филлер$stream->zipFilled($filler)
zipEqualТранспонирует поток строк по столбцам, бросает исключение при разных длинах$stream->zipEqual()
zipWithПараллельно итерирует коллекцию вместе с другими, пока не закончится самый короткий итератор$stream->zipWith(...$iterables)
zipEqualWithПараллельно итерирует коллекцию вместе с другими одного размера, в случае разных размеров бросает исключение$stream->zipEqualWith(...$iterables)
zipFilledWithПараллельно итерирует коллекцию вместе с другими, подставляя для закончившихся заданный филлер$stream->zipFilledWith($default, ...$iterables)
zipLongestWithПараллельно итерирует коллекцию вместе с другими, пока не закончится самый длинный итератор$stream->zipLongestWith(...$iterables)

Завершающие операции

Саммари о коллекции
ОперацияОписаниеПример кода
allMatchИстинно, если предикат возвращает истину для всех элементов коллекции$stream->allMatch($predicate)
allUniqueИстинно, если все элементы коллекции уникальны$stream->allUnique([$strict]])
anyMatchИстинно, если предикат возвращает истину хотя бы для одного элемента коллекции$stream->anyMatch($predicate)
arePermutationsWithИстинно, если коллекции являются перестановками друг друга$stream->arePermutationsWith(...$iterables)
arePermutationsCoerciveWithИстинно, если коллекции являются перестановками друг друга (в режиме приведения типов)$stream->arePermutationsCoerciveWith(...$iterables)
atLeastNИстинно, если предикат возвращает истину как минимум для N элементов$stream->atLeastN($n, [$predicate])
atMostNИстинно, если предикат возвращает истину не более чем для N элементов$stream->atMostN($n, [$predicate])
containsИстинно, если поток содержит искомое значение$stream->contains($needle)
containsCoerciveИстинно, если поток содержит искомое значение (в режиме приведения типов)$stream->containsCoercive($needle)
endsWithИстинно, если поток заканчивается заданным суффиксом$stream->endsWith($suffix)
endsWithCoerciveИстинно, если поток заканчивается заданным суффиксом (в режиме приведения типов)$stream->endsWithCoercive($suffix)
exactlyNИстинно, если предикат возвращает истину в точности для N элементов$stream->exactlyN($n, $predicate)
isEmptyИстинно, если коллекция пуста$stream::isEmpty()
isPartitionedИстинно, если истинные элементы находятся в коллекции перед ложными (истинность определяет предикат)$stream::isPartitioned($predicate)
isSortedИстинно, если коллекция отсортирована в прямом порядке$stream->isSorted()
isReversedИстинно, если коллекция отсортирована в обратном порядке$stream->isReversed()
isSortedByИстинно, если коллекция отсортирована по функции-ключу в прямом порядке$stream->isSortedBy($keyFunc)
isReversedByИстинно, если коллекция отсортирована по функции-ключу в обратном порядке$stream->isReversedBy($keyFunc)
noneMatchИстинно, если предикат возвращает ложь для всех элементов коллекции$stream->noneMatch($predicate)
sameWithИстинно, если данные коллекции одинаковы$stream->sameWith(...$iterables)
sameCountWithИстинно, если данные коллекции имеют одинаковую длину$stream->sameCountWith(...$iterables)
startsWithИстинно, если поток начинается с заданного префикса$stream->startsWith($prefix)
startsWithCoerciveИстинно, если поток начинается с заданного префикса (в режиме приведения типов)$stream->startsWithCoercive($prefix)
Редуцирование
Завершающая операцияОписаниеПример кода
toAverageСреднее арифметическое элементов коллекции$stream->toAverage()
toCountДлина коллекции$stream->toCount()
toCountByКоличества, сгруппированные по функции-ключу$stream->toCountBy($keyFunc)
toFirstПервый элемент коллекции$stream->toFirst()
toFirstAndLastПервый и последний элементы коллекции$stream->toFirstAndLast()
toFirstMatchПервый элемент, удовлетворяющий предикату$stream->toFirstMatch($predicate, [$default])
toFirstMatchIndexИндекс первого элемента, удовлетворяющего предикату$stream->toFirstMatchIndex($predicate, [$default])
toFirstMatchKeyКлюч первого элемента, удовлетворяющего предикату$stream->toFirstMatchKey($predicate, [$default])
toLastПоследний элемент коллекции$stream->toLast()
toLastMatchПоследний элемент, удовлетворяющий предикату$stream->toLastMatch($predicate, [$default])
toLastMatchIndexИндекс последнего элемента, удовлетворяющего предикату$stream->toLastMatchIndex($predicate, [$default])
toLastMatchKeyКлюч последнего элемента, удовлетворяющего предикату$stream->toLastMatchKey($predicate, [$default])
toOnlyЕдинственный элемент коллекции$stream->toOnly()
toMaxМаксимальное значение из элементов коллекции$stream->toMax([$compareBy])
toMinМинимальное значение из элементов коллекции$stream->toMin([$compareBy])
toMinMaxМинимальное и максимальное значения из элементов коллекции$stream->toMinMax([$compareBy])
toMedianМедиана коллекции из потока$stream->toMedian()
toModeСписок мод коллекции из потока$stream->toMode()
toVarianceДисперсия значений коллекции из потока$stream->toVariance([$sample])
toStandardDeviationСтандартное отклонение значений коллекции из потока$stream->toStandardDeviation([$sample])
toPercentileЗначение коллекции из потока для заданного процентиля$stream->toPercentile($percentile)
toQuantileЗначение коллекции из потока для заданного квантиля$stream->toQuantile($quantile)
toNthN-й элемент коллекции$stream->toNth($position)
toProductПроизведение элементов коллекции$stream->toProduct()
toStringПреобразование коллекции в строку$stream->toString([$separator], [$prefix], [$suffix])
toSumСумма элементов коллекции$stream->toSum()
toRandomValueСлучайный элемент из коллекции$stream->toRandomValue()
toRangeРазница между максимальным и минимальным элементами коллекции$stream->toRange()
toValueРедуцирование коллекции до значения, вычисляемого callback-функцией$stream->toValue($reducer, $initialValue)
Операции трансформации
Завершающая операцияОписаниеПример кода
toArrayВозвращает массив из элементов потока$stream->toArray()
toAssociativeArrayВозвращает ассоциативный массив из элементов потока$stream->toAssociativeArray($keyFunc, $valueFunc)
toPartitionРазделяет поток на два списка: истинные и ложные$stream->toPartition($predicate)
teeСоздает несколько одинаковых независимых потоков из данной коллекции$stream->tee($count)
Операции с побочными эффектами
Завершающая операцияОписаниеПример кода
callForEachВызывает callback-функцию для каждого элемента потока$stream->callForEach($function)
consumeПолный обход потока с отбрасыванием значений$stream->consume()
printprint каждого элемента потока$stream->print([$separator], [$prefix], [$suffix])
printLnprint каждого элемента потока с новой строки$stream->printLn()
toCsvFileЗаписывает содержимое потока в CSV файл$stream->toCsvFile($fileHandle, [$headers])
toFileЗаписывает содержимое потока в файл$stream->toFile($fileHandle)

Операции для дебаггинга

Отладочная операцияОписаниеПример кода
peekПросмотр каждого элемента коллекции между потоковыми операциями$stream->peek($peekFunc)
peekStreamПросмотр всей коллекции потока между операциями$stream->peekStream($peekFunc)
peekPrintПечать в поток вывода каждого элемента коллекции между операциями$stream->peekPrint()
peekPrintRВызов print_r для каждого элемента коллекции между операциями$stream->peekPrintR()
printRprint_r каждого элемента потока$stream->printR()
varDumpvar_dump каждого элемента потока$stream->varDump()

Использование

Все функции работают с iterable сущностями:

  • array (тип)
  • Generator (тип)
  • Iterator (интерфейс)
  • Traversable (интерфейс)

Композиция вызовов

IterTools позволяет комбинировать вызовы методов, чтобы получать новые коллекции.

Zip Strings

use IterTools\Multi;
use IterTools\Single;

$letters = 'ABCDEFGHI';
$numbers = '123456789';

foreach (Multi::zip(Single::string($letters), Single::string($numbers)) as [$letter, $number]) {
     $battleshipMove = new BattleshipMove($letter, $number)
}
// A1, B2, C3

Chain Strings

use IterTools\Multi;
use IterTools\Single;

$letters = 'abc';
$numbers = '123';

foreach (Multi::chain(Single::string($letters), Single::string($numbers)) as $character) {
    print($character);
}
// a, b, c, 1, 2, 3

Режимы типизации

Для методов, которые используют сравнение элементов коллекций для получения результата, по умолчанию сравнения выполняются строго без приведения типов:

  • scalars: сравнивает строго по типу;
  • objects: всегда считает разные экземпляры неравными;
  • arrays: сравнивает сериализованными.

В случае, если метод опционально поддерживает режим приведения типов (имеет аргумент $strict) при $strict установленном в false либо если метод имеет в названии слово Coercive, он будет работать в нестрогом режиме сравнения:

  • scalars: сравнивает нестрого по значению;
  • objects: сравнивает сериализованными;
  • arrays: сравнивает сериализованными.

Стандарты

IterTools PHP соответствует следующим стандартам:

Лицензия

IterTools PHP распространяется по лицензии MIT License.