2013-07-14 2 views
1

FilterIterator를 사용하여 값을 필터링하고 accept() 메서드를 성공적으로 구현했습니다. 그러나 단일 반복에서 내 accept 메서드에서 false를 반환하는 값을 얻는 것이 어떻게 가능할 지 궁금합니다. 아래 코드를 예로 들어 봅시다 (php.net에서 가져옴).FilterIterator에서 전달하지 않는 값을 가져 오는 방법

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

위의 코드에서 필터는 값을 직접 필터링하고 필터iterator에서 전달 된 값을 반환합니다. 다음과 같이 구현되었습니다.

$array = array(
array('name' => 'Jonathan','id' => '5'), 
array('name' => 'Abdul' ,'id' => '22') 
); 

$object = new ArrayObject($array); 
$iterator = new UserFilter($object->getIterator(),'abdul'); 

이 이름 조나단 만 배열을 포함합니다. 그러나 나는 Abdul이라는 이름의 객체를 다른 변수에 저장하는 것이 궁금하여 대신에 약간의 덧셈을 사용하여 같은 필터를 사용하여 전체 필터를 다시 구현하여?을 수행합니다. 필자가 생각한 한 가지 방법은 FilterIterator를 붙여 넣기를 복사하고 기본적으로 값을거짓으로 변경하는 것입니다. 그러나 목록에 또 다른 통과가 필요할 것이므로 깔끔한 방법이 있습니다.

답변

1

accept() 기계공을 다시 작성해야한다고 생각합니다. 대신 true 또는 false를 반환, 당신은이

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

return $result; 
처럼 보일 수 있습니다

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

코드에 배열을 분해 할 수 있습니다