2024 PHP Conference Japan

FilterIterator 類別

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

簡介

這個抽象迭代器會篩選掉不需要的值。 這個類別應該被繼承來實現自訂迭代器篩選器。 FilterIterator::accept() 方法必須在子類別中實作。

類別概要

abstract class FilterIterator extends IteratorIterator {
/* 方法 */
public __construct(Iterator $iterator)
public accept(): bool
公開 current(): 混合
公開 key(): 混合
公開 next():
公開 rewind():
公開 valid(): 布林
/* 繼承的方法 */
}

目錄

新增註解

使用者貢獻的註解 3 則註解

23
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 */

?>
此致。
5
匿名
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(有效)
-1
匿名
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