hiqdev/hoa-iterator

Hiqdev Hoa\Compiler 库。

1.0.1 2022-09-15 11:52 UTC

This package is auto-updated.

Last update: 2024-09-15 16:33:45 UTC


README

由于 Hoa 项目已被存档,因此既不提供升级也不接受合并请求。

HOA 包包含一些针对 PHP 8.0 和 PHP 8.1 已弃用的代码,但我们需要这些包才能在较新版本的 PHP 上运行。

从哪里改变了?

变化主要影响了方法声明中的返回数据类型提示以及未初始化属性的访问。

如何使用

我们目前已分叉以下包,主要是为了让 hoa/ruler 与 PHP 8.1 兼容

您只需将 composer.json 中的 hoa 包的要求替换为相应的分叉包:无需更改代码库中的任何内容。

如果您使用的是需要 hoa 的某人包,则只需将分叉包添加到您的项目根目录 composer.json 中:我们将分叉标记为替代品,因此 composer 将安装它们而不是原始包。

版本

我们从最新的 hoa 包版本分叉,并从 1.0 版本开始提升自己的版本。

测试

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

$ composer install

然后,要运行所有测试套件

$ vendor/bin/hoa test:run

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

快速使用

我们提供了一个所有迭代器的快速概览。

一个

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遵循新BSD许可证(BSD-3-Clause)。请参阅LICENSE以获取详细信息。