hoa/iterator

此软件包已被废弃,不再维护。未建议替代软件包。

Hoa\Iterator 库。

2.17.01.10 2017-01-10 10:34 UTC

README

Hoa

Build status Code coverage Packagist License

Hoa 是一组 模块化可扩展结构化 的 PHP 库。
此外,Hoa 还旨在成为工业界和学术界之间的桥梁。

Hoa\Iterator

Help on IRC Help on Gitter Documentation Board

此库提供了一组有用的迭代器(与 PHP 迭代器兼容)。现有 PHP 迭代器已更新,以获得新功能和与先前 PHP 版本的兼容性。

了解更多.

安装

使用 Composer,要将此库包含到依赖项中,您需要需要 hoa/iterator

$ composer require hoa/iterator '~2.0'

有关更多安装说明,请参阅 源代码页面

测试

在运行测试套件之前,必须安装开发依赖项

$ composer install

然后,运行所有测试套件

$ vendor/bin/hoa test:run

有关更多信息,请参阅 贡献者指南

快速使用

我们提供所有迭代器的快速概述。

One

Hoa\Iterator\Iterator 定义了迭代器的基础。它扩展了 Iterator

外部迭代器

Hoa\Iterator\Aggregate 允许一个类通过 getIterator 方法使用外部迭代器。它扩展了 IteratorAggregate

可遍历到迭代器

Hoa\Iterator\IteratorIterator 将任何可遍历的转换为迭代器。它扩展了 IteratorIterator

迭代器迭代器

Hoa\Iterator\Outer 代表一个遍历迭代器的迭代器。它扩展了 OuterIterator

模拟

Hoa\Iterator\Mock 代表一个空的迭代器。它扩展了 EmptyIterator

可查找

Hoa\Iterator\Seekable 代表一个可查找的迭代器。它扩展了 SeekableIterator

映射

Hoa\Iterator\Map 允许遍历数组。它扩展了 ArrayIterator

$foobar = new Hoa\Iterator\Map(['f', 'o', 'o', 'b', 'a', 'r']);

foreach ($foobar as $value) {
    echo $value;
}

/**
 * Will output:
 *     foobar
 */

过滤器

Hoa\Iterator\FilterHoa\Iterator\CallbackFilter 允许过滤迭代器的内容。它们扩展了 FilterIteratorCallbackFilterIterator

$filter = new Hoa\Iterator\CallbackFilter(
    $foobar,
    function ($value, $key, $iterator) {
        return false === in_array($value, ['a', 'e', 'i', 'o', 'u']);
    }
);

foreach ($filter as $value) {
    echo $value;
}

/**
 * Will output:
 *     fbr
 */

此外,Hoa\Iterator\RegularExpression 允许基于正则表达式进行过滤。

限制

Hoa\Iterator\Limit 允许从特定偏移量开始遍历迭代器的 n 个元素。它扩展了 LimitIterator

$limit = new Hoa\Iterator\Limit($foobar, 2, 3);

foreach ($limit as $value) {
    echo $value;
}

/**
 * Will output:
 *     oba
 */

无限

Hoa\Iterator\Infinite 允许反复遍历同一个迭代器。它扩展了 InfiniteIterator

$infinite = new Hoa\Iterator\Infinite($foobar);
$limit    = new Hoa\Iterator\Limit($infinite, 0, 21);

foreach ($limit as $value) {
    echo $value;
}

/**
 * Will output:
 *     foobarfoobarfoobarfoo
 */

此外,Hoa\Iterator\NoRewind 是一个不支持回滚的迭代器。它扩展了 NoRewindIterator

重复

Hoa\Iterator\Repeater 允许重复迭代器 n 次。

$repeater = new Hoa\Iterator\Repeater(
    $foobar,
    3,
    function ($i) {
        echo "\n";
    }
);

foreach ($repeater as $value) {
    echo $value;
}

/**
 * Will output:
 *     foobar
 *     foobar
 *     foobar
 */

计数器

Hoa\Iterator\Counter 等同于一个 for($i = $from, $i < $to, $i += $step) 循环。

$counter = new Hoa\Iterator\Counter(0, 12, 3);

foreach ($counter as $value) {
    echo $value, ' ';
}

/**
 * Will output:
 *     0 3 6 9
 */

迭代器联合

Hoa\Iterator\Append 允许逐个遍历迭代器。它扩展了 AppendIterator

$counter1 = new Hoa\Iterator\Counter(0, 12, 3);
$counter2 = new Hoa\Iterator\Counter(13, 23, 2);
$append   = new Hoa\Iterator\Append();
$append->append($counter1);
$append->append($counter2);

foreach ($append as $value) {
    echo $value, ' ';
}

/**
 * Will output:
 *     0 3 6 9 13 15 17 19 21 
 */

多重

Hoa\Iterator\Multiple 允许同时遍历多个迭代器。它扩展了 MultipleIterator

$foobar   = new Hoa\Iterator\Map(['f', 'o', 'o', 'b', 'a', 'r']);
$baz      = new Hoa\Iterator\Map(['b', 'a', 'z']);
$multiple = new Hoa\Iterator\Multiple(
    Hoa\Iterator\Multiple::MIT_NEED_ANY
  | Hoa\Iterator\Multiple::MIT_KEYS_ASSOC
);
$multiple->attachIterator($foobar, 'one', '!');
$multiple->attachIterator($baz,    'two', '?');

foreach ($multiple as $iterators) {
    echo $iterators['one'], ' | ', $iterators['two'], "\n";
}

/**
 * Will output:
 *     f | b
 *     o | a
 *     o | z
 *     b | ?
 *     a | ?
 *     r | ?
 */

解复用器

Hoa\Iterator\Demultiplexer 从另一个迭代器中解复用结果。这个迭代器在某种程度上与 Hoa\Iterator\Multiple 迭代器相反。

$counter  = new Hoa\Iterator\Counter(0, 10, 1);
$multiple = new Hoa\Iterator\Multiple();
$multiple->attachIterator($counter);
$multiple->attachIterator(clone $counter);
$demultiplexer = new Hoa\Iterator\Demultiplexer(
    $multiple,
    function ($current) {
        return $current[0] * $current[1];
    }
);

foreach ($demultiplexer as $value) {
    echo $value, ' ';
}

/**
 * Will output:
 *     0 1 4 9 16 25 36 49 64 81 
 */

文件系统

Hoa\Iterator\DirectoryHoa\Iterator\FileSystem 允许遍历文件系统,其中文件由 Hoa\Iterator\SplFileInfo 的实例表示。它们分别扩展了 DirectoryIteratorFilesystemIteratorSplFileInfo

$directory = new Hoa\Iterator\Directory(resolve('hoa://Library/Iterator'));

foreach ($directory as $value) {
    echo $value->getFilename(), "\n";
}

/**
 * Will output:
 *     .
 *     ..
 *     .State
 *     Aggregate.php
 *     Append.php
 *     CallbackFilter.php
 *     composer.json
 *     Counter.php
 *     Demultiplexer.php
 *     …
 */

此外,Hoa\Iterator\Glob 允许使用 glob 策略进行迭代。它扩展了 GlobIterator。因此

$glob = new Hoa\Iterator\Glob(resolve('hoa://Library/Iterator') . '/M*.php');

foreach ($glob as $value) {
    echo $value->getFilename(), "\n";
}

/**
 * Will output:
 *     Map.php
 *     Mock.php
 *     Multiple.php
 */

预览

Hoa\Iterator\Lookahead 允许预览下一个元素

$counter   = new Hoa\Iterator\Counter(0, 5, 1);
$lookahead = new Hoa\Iterator\Lookahead($counter);

foreach ($lookahead as $value) {
    echo $value;

    if (true === $lookahead->hasNext()) {
        echo ' (next: ', $lookahead->getNext(), ')';
    }

    echo "\n";
}

/**
 * Will output:
 *     0 (next: 1)
 *     1 (next: 2)
 *     2 (next: 3)
 *     3 (next: 4)
 *     4
 */

还存在 Hoa\Iterator\Lookbehind,它允许回望前一个元素。

缓冲区

Hoa\Iterator\Buffer 允许像往常一样向前移动,但也可以在另一个迭代器上向后移动,直到达到给定的缓冲区大小。

$abcde  = new Hoa\Iterator\Map(['a', 'b', 'c', 'd', 'e']);
$buffer = new Hoa\Iterator\Buffer($abcde, 3);

$buffer->rewind();
echo $buffer->current(); // a

$buffer->next();
echo $buffer->current(); // b

$buffer->next();
echo $buffer->current(); // c

$buffer->previous();
echo $buffer->current(); // b

$buffer->previous();
echo $buffer->current(); // a

$buffer->next();
echo $buffer->current(); // b

/**
 * Will output:
 *     abcbab
 */

回调生成器

Hoa\Iterator\CallbackGenerator 允许将任何可调用对象转换为迭代器。当与其他迭代器结合使用时,例如与 Hoa\Iterator\Limit 结合使用时,这非常有用。

$generator = new Hoa\Iterator\CallbackGenerator(function ($key) {
    return mt_rand($key, $key * 2);
});
$limit = new Hoa\Iterator\Limit($generator, 0, 10);

foreach ($limit as $value) {
    echo $value, ' ';
}

/**
 * Could output:
 *     0 2 3 4 4 7 8 10 12 18 
 */

递归迭代器

递归迭代器是一种其值是其他迭代器的迭代器。最重要的接口是 Hoa\Iterator\Recursive\Recursive(它扩展了 RecursiveIterator)。然后我们可以找到(按字母顺序)

文档

《Hoa\Iterator》黑客手册包含了有关如何使用此库以及它如何工作的详细信息。

要本地生成文档,请执行以下命令

$ composer require --dev hoa/devtools
$ vendor/bin/hoa devtools:documentation --open

更多文档可以在项目网站上找到: hoa-project.net

获取帮助

主要有两种方式获取帮助

贡献

你想贡献吗?谢谢!详细的 贡献指南解释了你需要知道的一切。

许可

Hoa 在 New BSD 许可证(BSD-3-Clause)下。请参阅 LICENSE 以获取详细信息。