xdimedrolx/hoa-iterator

Hiqdev Hoa\Compiler 库。

1.1.2 2022-11-02 20:11 UTC

This package is auto-updated.

Last update: 2024-08-30 01:14:57 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获取详细信息。