2012-02-08 2 views
2

Скажем, у меня есть следующие ArrayObject:Петля RecursiveIteratorIterator из расширенного RecursiveIterator с дополнительными аргументами

$array_object = new ArrayObject(array(
    array('1', '2', '3', '4'), 
    array('3', '6', '7', '8'), 
    array('9', '3', '11', '12'), 
)); 

И я выражаю RecursiveFilterIterator принимать только дочерние элементы, значение которого равно некоторому значению передается в качестве аргумента:

class myRecursiveFilterIterator extends RecursiveFilterIterator 
{ 
    public $value; 

    public function __construct($it, $value) 
    { 
     parent::__construct($it); 
     $this->value = $value; 
    } 

    public function accept() 
    { 
     return (parent::hasChildren()) || (parent::current() == $this->value); 
    } 
} 

создать экземпляр этого совершенно нового итератора, чтобы фильтровать значения, равные, чем 3:

$recursive_filter_iterator = new myRecursiveFilterIterator(new RecursiveArrayIterator($array_object), 3); 

Если теперь I контура весь myRecursiveFilterIterator с помощью RecursiveIteratorIterator:

foreach (new RecursiveIteratorIterator($recursive_filter_iterator) as $value) { 
    var_dump($value); 
} 

Я получаю следующее предупреждение:

Warning: Missing argument 2 for myRecursiveFilterIterator::__construct() in /my/path/test.php on line myLine Notice: Undefined variable: value in /my/path/test.php on line myOtherLine 

Так it'is как, когда цикл RecursiveIteratorIterator пытается например myRecursiveFilterIterator без прохождения второго аргумент $value.

Этого не происходит, если я продлеваю FilterIterator без дополнительных аргументов.

ответ

2

я решил запустить сценарий мой сам, и это то, что заметили

  1. вы работаете с несколькими массив так parent::current() может быть массив, который означает, что ниже линии неправильно, потому что $this->value является целое число.

    return (parent::hasChildren()) || (parent::current() == $this->value); 
    
  2. $this->current() также переключает строки в массив вы можете сделать это, чтобы управлять и в зависимости от того, что вы хотите достичь

    if (is_array ($current)) { 
        return ($this->hasChildren()) || (in_array ((string) $this->value, $this->current())); 
    } else { 
    
        //var_dump ($this->value, $this->current()); 
    
        return ($this->hasChildren()) || ($this->value == $this->current()); 
    } 
    
  3. Кроме того, необходимо реализовать getChildren метод, почему PHP был жалуется Отсутствует аргумент 2 для myRecursiveFilterIterator::__construct()

    public function getChildren() { 
        return new self ($this->getInnerIterator()->getChildren(), $this->value); 
    } 
    

================ = ==============

PHP наиболее пообщались сообщение об ошибке неправильно .. ваш код хорошо, но ошибка возникла при попытке использовать Еогеасп с RecursiveIteratorIterator непосредственно

Вот лучший подход с использованием RecursiveArrayIterator инкапсулировать RecursiveIteratorIterator:

foreach (new RecursiveArrayIterator(new RecursiveIteratorIterator($recursive_filter_iterator)) as $value) { 
    var_dump($value); 
} 

:)

+0

Спасибо за ваш ответ, @Baba, но это не работает. Предупреждение исчезает, но ничто не зацикливается (ни «$ value» не является var_dumped, ни что-либо повторяет, если его пытают) –

+0

Вместо того, чтобы дать вам альтернативу, я решил найти причину вашей ошибки ... см. Обновленный ответ – Baba

+0

Great @Baba! !! Это работает! Итак, трюк был в методе 'getChildren()' ...:) Большое спасибо. –