FilterIterator を使用して値を除外し、accept()メソッドを正常に実装しました。しかし、accept メソッドから false を返した値を 1 回の反復で取得するにはどうすればよいのでしょうか。以下のコードを例に取りましょう ( php.netから取得)。
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;
}
}
上記のコードでは、値を直接フィルタリングし、filteriterator から渡された値を返します。として実装されます。
$array = array(
array('name' => 'Jonathan','id' => '5'),
array('name' => 'Abdul' ,'id' => '22')
);
$object = new ArrayObject($array);
$iterator = new UserFilter($object->getIterator(),'abdul');
Jonathanという名前の配列のみが含まれます。ただし、フィルター全体を再実装して反対のことを行うのではなく、同じフィルターを使用して、Abdulという名前のオブジェクトを別の変数に格納することは可能でしょうか? 私が考えていた1つの方法は、 FilterIterator を正確にコピーして貼り付け、基本的にtrueとfalseの値を変更することです。ただし、リストで別のトラバーサルが必要になるため、それを行うためのきちんとした方法はありますか。