1

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 を正確にコピーして貼り付け、基本的にtruefalseの値を変更することです。ただし、リストで別のトラバーサルが必要になるため、それを行うためのきちんとした方法はありますか。

4

1 に答える 1

1

accept()メカニズムを書き直す必要があると思います。true または false を返す代わりに、配列を分解して

$result = array(
    'passed' => array(...),
    'not_passed' => array(...)
);

コードは次のようになります

if (strcasecmp($user['name'], $this->userFilter) == 0) {
    $result['not_passed'][] = $user;
} else {
    $result['passed'][] = $user;
}

return $result;
于 2013-07-14T10:40:30.347 に答える