Итерирование с сортировкой
July 26, 2026 · View on GitHub
Инструменты для итерирования отсортированных коллекций.
ASort
Сортирует коллекцию с сохранением ключей.
Sort::asort(iterable $data, ?callable $comparator = null)
Если $comparator не передан, элементы коллекции должны быть сравнимы.
use IterTools\Sort;
$worldPopulations = [
'China' => 1_439_323_776,
'India' => 1_380_004_385,
'Indonesia' => 273_523_615,
'Pakistan' => 220_892_340,
'USA' => 331_002_651,
];
foreach (Sort::asort($worldPopulations) as $country => $population) {
print("$country: $population" . \PHP_EOL);
}
// Pakistan: 220,892,340
// Indonesia: 273,523,615
// USA: 331,002,651
// India: 1,380,004,385
// China: 1,439,323,776
Sort
Сортирует коллекцию.
Sort::sort(iterable $data, ?callable $comparator = null)
Если $comparator не передан, элементы коллекции должны быть сравнимы.
use IterTools\Sort;
$data = [3, 4, 5, 9, 8, 7, 1, 6, 2];
foreach (Sort::sort($data) as $datum) {
print($datum);
}
// 1, 2, 3, 4, 5, 6, 7, 8, 9
SortBy
Сортирует коллекцию по ключу, извлечённому из каждого элемента (преобразование Шварца).
Sort::sortBy(iterable $data, callable $keyFn)
Функция извлечения ключа вызывается ровно один раз для каждого элемента.
Исходные ключи отбрасываются (как у Sort::sort). Сортировка устойчивая:
элементы с равными ключами сохраняют исходный относительный порядок.
Аналог в Stream: Stream::sortBy().
use IterTools\Sort;
$people = [
(object)['name' => 'Alice', 'age' => 30],
(object)['name' => 'Bob', 'age' => 20],
(object)['name' => 'Carol', 'age' => 40],
];
foreach (Sort::sortBy($people, fn ($p) => $p->age) as $person) {
print("{$person->name}: {$person->age}" . \PHP_EOL);
}
// Bob: 20
// Alice: 30
// Carol: 40
use IterTools\Sort;
$words = ['banana', 'fig', 'cherry', 'apple'];
foreach (Sort::sortBy($words, fn (string $s) => \strlen($s)) as $word) {
print($word . \PHP_EOL);
}
// fig
// apple
// banana
// cherry
AsortBy
Сортирует коллекцию по ключу, извлечённому из каждого элемента (преобразование Шварца), с сохранением ключей.
Sort::asortBy(iterable $data, callable $keyFn)
Функция извлечения ключа вызывается ровно один раз для каждого элемента.
Исходные ключи сохраняются (как у Sort::asort). Сортировка устойчивая:
элементы с равными ключами сохраняют исходный относительный порядок.
Аналог в Stream: Stream::asortBy().
use IterTools\Sort;
$scores = [
'Alice' => 87,
'Bob' => 92,
'Carol' => 75,
];
foreach (Sort::asortBy($scores, fn (int $score) => $score) as $name => $score) {
print("$name: $score" . \PHP_EOL);
}
// Carol: 75
// Alice: 87
// Bob: 92
use IterTools\Sort;
$people = [
'alice' => (object)['age' => 30],
'bob' => (object)['age' => 20],
'carol' => (object)['age' => 40],
];
foreach (Sort::asortBy($people, fn ($p) => $p->age) as $key => $person) {
print("$key => age {$person->age}" . \PHP_EOL);
}
// bob => age 20
// alice => age 30
// carol => age 40
Largest
Возвращает n наибольших элементов коллекции в порядке убывания.
Sort::largest(iterable $data, int $n, callable $keyFn = null)
Использует ограниченную кучу размера n — полная сортировка входа не выполняется,
что эффективно для больших входов, когда нужны только несколько крайних значений
(O(N log n)).
$nдолжно быть неотрицательным; иначе бросается\InvalidArgumentException.$n = 0возвращает пустой генератор без обхода входа.$nбольше размера входа — возвращает весь вход, отсортированный по убыванию.- Устойчивая: элементы с равными извлечёнными ключами сохраняются в исходном порядке, когда количество совпадений превышает доступные слоты, и эмитятся в порядке вставки среди равных.
- Политика NaN: элементы, чей ключ сравнения равен NaN, пропускаются.
Аналог в Stream: Stream::largest().
use IterTools\Sort;
$data = [3, 1, 4, 1, 5, 9, 2, 6];
foreach (Sort::largest($data, 3) as $datum) {
print($datum . \PHP_EOL);
}
// 9
// 6
// 5
use IterTools\Sort;
$leaderboard = [
(object)['name' => 'Alice', 'score' => 87],
(object)['name' => 'Bob', 'score' => 92],
(object)['name' => 'Carol', 'score' => 75],
(object)['name' => 'Dave', 'score' => 95],
(object)['name' => 'Eve', 'score' => 90],
];
foreach (Sort::largest($leaderboard, 3, fn ($p) => $p->score) as $player) {
print("{$player->name}: {$player->score}" . \PHP_EOL);
}
// Dave: 95
// Bob: 92
// Eve: 90
Smallest
Возвращает n наименьших элементов коллекции в порядке возрастания.
Sort::smallest(iterable $data, int $n, callable $keyFn = null)
Использует ограниченную кучу размера n — полная сортировка входа не выполняется,
что эффективно для больших входов, когда нужны только несколько крайних значений
(O(N log n)).
$nдолжно быть неотрицательным; иначе бросается\InvalidArgumentException.$n = 0возвращает пустой генератор без обхода входа.$nбольше размера входа — возвращает весь вход, отсортированный по возрастанию.- Устойчивая: элементы с равными извлечёнными ключами сохраняются в исходном порядке, когда количество совпадений превышает доступные слоты, и эмитятся в порядке вставки среди равных.
- Политика NaN: элементы, чей ключ сравнения равен NaN, пропускаются.
Аналог в Stream: Stream::smallest().
use IterTools\Sort;
$data = [3, 1, 4, 1, 5, 9, 2, 6];
foreach (Sort::smallest($data, 3) as $datum) {
print($datum . \PHP_EOL);
}
// 1
// 1
// 2
use IterTools\Sort;
$requests = [
(object)['id' => 'r1', 'durationMs' => 120],
(object)['id' => 'r2', 'durationMs' => 50],
(object)['id' => 'r3', 'durationMs' => 200],
(object)['id' => 'r4', 'durationMs' => 80],
(object)['id' => 'r5', 'durationMs' => 65],
];
foreach (Sort::smallest($requests, 3, fn ($r) => $r->durationMs) as $request) {
print("{$request->id}: {$request->durationMs}ms" . \PHP_EOL);
}
// r2: 50ms
// r5: 65ms
// r4: 80ms
Shuffle
Отдаёт элементы коллекции в случайном порядке.
Sort::shuffle(iterable $data, ?\Random\Engine $engine = null)
- Материализует входные данные.
- Ключи исходной коллекции отбрасываются; ключи результата — последовательные, начиная с 0.
- Опциональный параметр
$engineпозволяет задать детерминированный seed (например,new \Random\Engine\Mt19937(42)).
use IterTools\Sort;
$deck = ['A♠', 'K♠', 'Q♠', 'J♠'];
foreach (Sort::shuffle($deck) as $card) {
print($card . ' ');
}
// например: J♠ A♠ Q♠ K♠