Скажем, у меня есть следующие 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
без дополнительных аргументов.
Спасибо за ваш ответ, @Baba, но это не работает. Предупреждение исчезает, но ничто не зацикливается (ни «$ value» не является var_dumped, ни что-либо повторяет, если его пытают) –
Вместо того, чтобы дать вам альтернативу, я решил найти причину вашей ошибки ... см. Обновленный ответ – Baba
Great @Baba! !! Это работает! Итак, трюк был в методе 'getChildren()' ...:) Большое спасибо. –