实验 / iterate
根据场景迭代迭代器。
2.0.0
2018-04-08 12:34 UTC
Requires
- php: ^7.1
Requires (Dev)
- phpunit/phpunit: ^6.5
- symfony/console: ^4.0
This package is auto-updated.
Last update: 2024-09-14 19:53:24 UTC
README
PHP类和接口,用于按场景迭代\Iterator
,或按场景对迭代器元素执行正则表达式匹配。
场景是一个实现ScenarioInterface
接口或扩展BaseScenario
或BaseRegexScenario
抽象类的类。它接收一个Iterator
实例,并在迭代过程的某些时刻执行逻辑——例如,当执行正则表达式匹配时——当某个模式匹配主题,或者没有匹配,或者在进行搜索之前/之后等。
将其视为迭代器的array_walk()
或iterator_apply()
,但是您提供一个具有多个方法的对象(场景),而不是单个回调。您可以将这些场景用作插件。
迭代器是任何实现\Iterator
接口的对象。
主类是Iterate
,它只需要实例化,并使用迭代器和场景对象调用。
非常适合用作Composer库。
需求
- PHP ≥ 7.1
安装
要将此库添加到您的Composer项目中
composer require shiyan/iterate
用法
包含2个基本场景
- 最基本的场景是在迭代器的每个元素上无条件执行一些逻辑。
- 基于正则表达式的一个,它对迭代器元素(转换为字符串)执行正则表达式匹配(使用一个或多个模式),并根据匹配的模式或是否没有匹配执行不同的逻辑。
示例
假设有一个字符串数组$array
。遍历它,将所有空字符串转换为0(零),打印所有包含"PHP"的字符串,并简单地计算其他所有元素的数量。
首先,创建一个场景类
use Shiyan\Iterate\Scenario\BaseRegexScenario;
class ExampleScenario extends BaseRegexScenario {
const PATTERN_EMPTY = '/^$/';
const PATTERN_PHP = '/PHP/';
public $counter;
public function getPatterns(): array {
return [self::PATTERN_EMPTY, self::PATTERN_PHP];
}
public function preRun(): void {
$this->counter = 0;
}
public function onMatch(array $matches, string $pattern): void {
switch ($pattern) {
case self::PATTERN_EMPTY:
$this->iterator[$this->iterator->key()] = 0;
break;
case self::PATTERN_PHP:
print $this->iterator->current() . "\n";
break;
}
}
public function ifNotMatched(): void {
++$this->counter;
}
}
然后
use Shiyan\Iterate\Iterate;
// Convert our array of strings to the iterator object.
$iterator = new ArrayIterator($array);
$scenario = new ExampleScenario();
$iterate = new Iterate();
// Invoke iterate with our scenario.
$iterate($iterator, $scenario);
print "Found {$scenario->counter} non-empty, non-PHP strings.\n";
// Let's check that empty strings were converted to zeros.
print_r($iterator->getArrayCopy());
// If we invoke Iterate with the same scenario once again, it won't find empty
// strings anymore. Instead, we'll have a higher number in the $counter property
// of the $scenario object, because the "0" doesn't match our patterns.
$iterate($iterator, $scenario);
print "Found {$scenario->counter} non-empty, non-PHP strings.\n";