The FilterIterator class

(PHP 5 >= 5.1.0, PHP 7)

简介

这个抽象类的遍历并过滤出不想要的值.这个类应该被实现了迭代过滤器的类继承 FilterIterator::accept()方法必须被子类实现.

类摘要

abstract FilterIterator extends IteratorIterator implements OuterIterator {
/* 方法 */
public abstract bool accept ( void )
public __construct ( Iterator $iterator )
public mixed current ( void )
public Iterator getInnerIterator ( void )
public mixed key ( void )
public void next ( void )
public void rewind ( void )
public bool valid ( void )
}

Table of Contents

User Contributed Notes

Anonymous 27-May-2014 05:01
A little test about the function call order:

<?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;
}

?>

This will output the following:

rewind
valid
key
accept

next
valid
key
accept

next
valid
key
accept

next
valid
Venelin Vulkov 05-Nov-2008 09:36
The code below is a simple example of usage . Note that the method which does the actual job is 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);

// Note it is case insensitive check in our example due the usage of strcasecmp function
$iterator = new UserFilter($object->getIterator(),'abdul');

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

/* Outputs Jonathan */

?>
Regards.