2024 PHP 日本大会

FilterIterator 类

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

简介

此抽象迭代器过滤掉不需要的值。此类应扩展以实现自定义迭代器过滤器。必须在子类中实现FilterIterator::accept()

类概要

abstract class FilterIterator extends IteratorIterator {
/* 方法 */
public __construct(Iterator $iterator)
public accept(): bool
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
/* 继承的方法 */
}

目录

添加注释

用户贡献的注释 3 条注释

Venelin Vulkov
16 年前
以下代码是一个简单的用法示例。请注意,执行实际工作的 method 是 accept。

<?php
class UserFilter extends FilterIterator
{
private
$userFilter;

public function
__construct(Iterator $iterator , $filter )
{
parent::__construct($iterator);
$this->userFilter = $filter;
}

public function
accept()
{
$user = $this->getInnerIterator()->current();
if(
strcasecmp($user['name'],$this->userFilter) == 0) {
return
false;
}
return
true;
}
}

$array = array(
array(
'name' => 'Jonathan','id' => '5'),
array(
'name' => 'Abdul' ,'id' => '22')
);

$object = new ArrayObject($array);

// 注意,由于使用了 strcasecmp 函数,我们的示例中进行了大小写不敏感的检查
$iterator = new UserFilter($object->getIterator(),'abdul');

foreach (
$iterator as $result) {
echo
$result['name'];
}

/* 输出 Jonathan */

?>
此致。
匿名
10 年前
关于函数调用顺序的一个小测试

<?php

class TestIterator extends IteratorIterator
{
public function
key()
{
echo
__FUNCTION__, PHP_EOL;
return
parent::key();
}

public function
next()
{
echo
__FUNCTION__, PHP_EOL;
return
parent::next();
}

public function
rewind()
{
echo
__FUNCTION__, PHP_EOL;
return
parent::rewind();
}

public function
valid()
{
echo
__FUNCTION__, PHP_EOL;
return
parent::valid();
}
}

class
TestFilterIterator extends FilterIterator
{
public function
accept()
{
echo
__FUNCTION__, PHP_EOL;
return
true;
}
}

$iterator = new ArrayIterator(array('a', 'b', 'c'));

foreach (new
TestFilterIterator(new TestIterator($iterator)) as $k => $v) {
echo
PHP_EOL;
}

?>

这段代码将会输出以下内容:

rewind
valid
key
accept

next
valid
key
accept

next
valid
key
accept

next
valid
匿名用户
2年前
通过方法过滤对象集合
<?php
/**
* @method object current()
*/
class CollectionFilterIterator extends FilterIterator
{
private
$methodName;
private
$methodArguments;

public function __construct(Iterator $collection, string $methodName, array $methodArguments = [])
{
parent::__construct($collection);
$this->methodName = $methodName;
$this->methodArguments = array_values($methodArguments);
}

public function
accept(): bool
{
return (bool) $this->current()->{$this->methodName}(...$this->methodArguments);
// 或者使用 call_user_func_array([$this->current(), $this->methodName], $this->methodArguments);
}
}
?>
To Top