1

我正在使用 FilterIterator 过滤掉值并成功实现了accept()方法。但是我想知道如何在单次迭代中从我的接受方法中获取返回 false 的值。我们以下面的代码为例(取自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的对象存储在另一个变量中,并稍加添加,而不是重新实现整个过滤器来做相反的事情?我想的一种方法是完全复制粘贴 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 回答