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

July 26, 2026 · View on GitHub

Вернуться к главной странице

Инструменты для итерирования, связанного с математическими операциями.


Frequencies

Возвращает генератор, при обходе которого ключами оказываются элементы поданной на вход последовательности, а значениями — количества вхождений соответствующих элементов.

Math::frequencies(iterable $data, bool $strict = true): \Generator

По умолчанию выполняет сравнение в режиме строгой типизации. Передайте значение false аргумента $strict, чтобы работать в режиме приведения типов.

use IterTools\Math;

$grades = ['A', 'A', 'B', 'B', 'B', 'C'];

foreach (Math::frequencies($grades) as $grade => $frequency) {
    print("$grade: $frequency" . \PHP_EOL);
}
// A: 2, B: 3, C: 1

Frequencies By

Возвращает распределение частот элементов, сгруппированных по значению, которое возвращает функция-ключ.

Math::frequenciesBy(iterable $data, callable $keyFunc, bool $strict = true): \Generator

Функция-ключ должна возвращать int или string (единственные допустимые типы ключей массива). При любом другом типе возвращаемого значения выбрасывается \TypeError с указанием некорректного типа. По умолчанию выполняет сравнение в режиме строгой типизации; передайте false аргумента $strict, чтобы работать в режиме приведения типов (при котором числовая строка-ключ, например "1", объединяется с целочисленным ключом 1).

В строгом режиме такие ключи остаются отдельными группами, но ключи массивов в PHP канонизируют числовые строки — поэтому при материализации генератора (через iterator_to_array или терминальную операцию Stream, которая строит массив) группы сливаются, и остаётся только одно из двух значений счётчика. Чтобы увидеть все группы, итерируйте генератор напрямую или используйте Reduce::toCountBy, который вместо этого суммирует такие ключи в один счётчик.

use IterTools\Math;

$words = ['apple', 'pear', 'banana', 'kiwi'];

foreach (Math::frequenciesBy($words, fn ($word) => \strlen($word)) as $length => $frequency) {
    print("$length: $frequency" . \PHP_EOL);
}
// 5: 1, 4: 2, 6: 1

Relative Frequencies

Возвращает генератор, при обходе которого ключами оказываются элементы поданной на вход последовательности, а значениями — относительные частоты вхождений соответствующих элементов.

Math::relativeFrequencies(iterable $data, bool $strict = true): \Generator

По умолчанию выполняет сравнение в режиме строгой типизации. Передайте значение false аргумента $strict, чтобы работать в режиме приведения типов.

use IterTools\Math;

$grades = ['A', 'A', 'B', 'B', 'B', 'C'];

foreach (Math::relativeFrequencies($grades) as $grade => $frequency) {
    print("$grade: $frequency" . \PHP_EOL);
}
// A: 0.33, B: 0.5, C: 0.166

Relative Frequencies By

Возвращает распределение относительных частот элементов, сгруппированных по значению, которое возвращает функция-ключ, нормированное к диапазону [0, 1].

Math::relativeFrequenciesBy(iterable $data, callable $keyFunc, bool $strict = true): \Generator

Использует тот же контракт функции-ключа (int|string) и семантику $strict, что и frequenciesBy.

use IterTools\Math;

$words = ['apple', 'pear', 'kiwi', 'plum'];

foreach (Math::relativeFrequenciesBy($words, fn ($word) => \strlen($word)) as $length => $frequency) {
    print("$length: $frequency" . \PHP_EOL);
}
// 5: 0.25, 4: 0.75

Running Average

Накопление среднего арифметического элементов коллекции в процессе итерирования.

Math::runningAverage(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$grades = [100, 80, 80, 90, 85];

foreach (Math::runningAverage($grades) as $runningAverage) {
    print($runningAverage);
}
// 100, 90, 86.667, 87.5, 87

Running Difference

Накопление разности элементов коллекции в процессе итерирования.

Math::runningDifference(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$credits = [1, 2, 3, 4, 5];

foreach (Math::runningDifference($credits) as $runningDifference) {
    print($runningDifference);
}
// -1, -3, -6, -10, -15

Опционально позволяет начать вычисления с заданного значения.

use IterTools\Math;

$dartsScores   = [50, 50, 25, 50];
$startingScore = 501;

foreach (Math::runningDifference($dartsScores, $startingScore) as $runningScore) {
    print($runningScore);
}
// 501, 451, 401, 376, 326

Running Max

Поиск максимального значения в процессе итерирования.

Math::runningMax(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$numbers = [1, 2, 1, 3, 5];

foreach (Math::runningMax($numbers) as $runningMax) {
    print($runningMax);
}
// 1, 2, 2, 3, 5

Running Min

Поиск минимального значения в процессе итерирования.

Math::runningMin(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$numbers = [3, 4, 2, 5, 1];

foreach (Math::runningMin($numbers) as $runningMin) {
    print($runningMin);
}
// 3, 3, 2, 2, 1

Running Product

Накопление произведения элементов коллекции в процессе итерирования.

Math::runningProduct(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$numbers = [1, 2, 3, 4, 5];

foreach (Math::runningProduct($numbers) as $runningProduct) {
    print($runningProduct);
}
// 1, 2, 6, 24, 120

Опционально позволяет начать вычисления с заданного значения.

use IterTools\Math;

$numbers      = [1, 2, 3, 4, 5];
$initialValue = 5;

foreach (Math::runningProduct($numbers, $initialValue) as $runningProduct) {
    print($runningProduct);
}
// 5, 5, 10, 30, 120, 600

Running Total

Накопление суммы элементов коллекции в процессе итерирования.

Math::runningTotal(iterable $numbers, int|float $initialValue = null)

use IterTools\Math;

$prices = [1, 2, 3, 4, 5];

foreach (Math::runningTotal($prices) as $runningTotal) {
    print($runningTotal);
}
// 1, 3, 6, 10, 15

Опционально позволяет начать вычисления с заданного значения.

use IterTools\Math;

$prices       = [1, 2, 3, 4, 5];
$initialValue = 5;

foreach (Math::runningTotal($prices, $initialValue) as $runningTotal) {
    print($runningTotal);
}
// 5, 6, 8, 11, 15, 20