chh/itertools

迭代器的常用功能操作。

v1.0.0 2013-01-08 17:10 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:20:08 UTC


README

itertools 旨在将 PHP 迭代器的操作支持提升到与数组相同的水平。

安装

通过 composer 安装

% wget https://getcomposer.org.cn/composer.phar
% php composer.phar require chh/itertools:~1.0

使用方法

itertools 通过一系列函数提供了一组操作。大多数函数通过将迭代器包装在另一个迭代器中来操作。这意味着大多数操作都是惰性评估的,除非这样做没有意义。

这使得这些函数成为过滤或映射

  • Symfony Finder 实例的效率解决方案
  • 对象 PDOStatementMysqli_Result (自 5.4.0 版本起)。
  • 实现 \Traversable 的 ORM 数据集/集合。

\Traversable itertools\slice(\Traversable $traversable, $start, [$count = -1])

将可遍历的包装在一个迭代器中,从给定的偏移量 $start 开始迭代,并在产生 $count 个元素后停止。默认情况下,它遍历包装的可遍历对象直到末尾。

示例

<?php

use itertools;

$users = new ArrayIterator(['John', 'Jim', 'Joe']);

foreach (itertools\slice($users, 1) as $user) {
    echo "$user\n";
}
# Output:
# Jim
# Joe

\Traversable itertools\map(callable $callback, \Traversable $traversable...)

返回一个迭代器,当调用回调函数时,为每个可遍历的当前元素产生回调函数的返回值。回调函数接收所有迭代器的当前元素,按 itertools\map() 传递的顺序。

示例

<?php

use itertools;

$a = new ArrayIterator(['one', 'two', 'three']);
$b = new ArrayIterator([1, 2, 3]);

$tuples = itertools\map(
    function($word, $number) {
        return [$word, $number];
    },
    $a, $b
);

foreach ($tuples as $t) {
    var_export($t);
}
# ['one', 1]
# ['two', 2]
# ['three', 3]

\Traversable itertools\filter(\Traversable $traversable, [callable $callback])

基于回调函数的返回值删除所有元素,或者当省略回调函数时删除所有非“真”值。类似于 array_filter()

<?php

use itertools;

$a = new ArrayIterator(range(1, 10));

var_export(iterator_to_array(
    itertools\filter($a, function($value) {
        return $value >= 7;
    })
));
# Output:
# [7, 8, 9]

\Traversable itertools\flip(\Traversable $traversable)

返回一个迭代器,产生内部迭代器的键,并在 key() 中产生值。类似于 array_flip()。非标量值不是有效的 PHP 数组键,因此请确保它们至少是可序列化为字符串的。

\Traversable itertools\xrange($start, $end, [$step = 1])

返回一个迭代器,产生从 $start 到包含 $end 的给定范围内的所有数字,并在每次迭代后增加给定的 $step

当需要遍历一个很大的范围(这里的大指的是几百万)时,这个迭代器非常有用,因为它更节省内存。这是因为不需要将所有可能的数字存储在数组中。

void itertools\walk(\Iterator $iterator, callable $callback)

对迭代器的每个元素调用回调函数。与 iterator_apply() 不同,忽略回调函数的返回值。

\Traversable itertools\to_iterator($value)

将任何值转换为有效的迭代器。

  • 迭代器直接传递。
  • 仅实现 \Traversable 的对象被包装在 \IteratorIterator 中(例如 PDOStatement)。
  • 数组被包装在 ArrayIterator 中。
  • 其他所有内容都被转换为 array,然后包装在 \ArrayIterator 中。

许可证

版权所有 (c) 2014 Christoph Hochstrasser christoph.hochstrasser@gmail.com

特此授予任何人获得此软件及其相关文档文件(“软件”)副本的权利,免费使用软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的人提供使用本软件的权利,但需遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的质量保证,无论是明示的还是暗示的,包括但不限于适用性、特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是在合同行为、侵权行为或其他情况下,无论该索赔、损害或其他责任是否源于、由或与该软件或对该软件的使用或其他方式有关。