при использовании итераторов в PHP вы можете использовать функцию iterator_to_array
для извлечения массива, получающегося в результате итерации. Например, допустим, у вас есть следующее ArrayObject
:
$array_object = new ArrayObject(array(
array('1', '2', '3', '4'),
array('5', '6', '7', '8'),
array('9', '10', '11', '12'),
));
Как видите, его хранилище представляет собой двумерный массив.
Мы можем создать FilterOperator
, чтобы принять только его первый элемент (я знаю, что было бы лучше с LimitIterator
, это просто в качестве примера):
class myFilterIterator extends FilterIterator
{
public function accept()
{
return ($this->key() === 0);
}
}
$filter_iterator = new myFilterIterator(new ArrayIterator($array_object));
Теперь, если я сделаю:
print_r(iterator_to_array($filter_iterator));
Я получаю массив, который смог бы получить, если вручную выполнить цикл через оператор:
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )
Но что теперь, если я хочу работать с RecursiveFilterIterator
? Допустим, у меня есть:
class myRecursiveFilterIterator extends RecursiveFilterIterator
{
public function accept()
{
return ($this->hasChildren() || $this->key() === 0);
}
}
$recursive_filter_iterator = new myRecursiveFilterIterator(new RecursiveArrayIterator($array_object));
Как видите, это будет принимать только ключ 0 для каждого массива, содержащегося в родительском массиве. И так это работает, если я рекурсивно итерирую по нему:
foreach (new RecursiveIteratorIterator($recursive_filter_iterator) as $value) {
print_r($value);
echo '<br />';
}
Результат:
1
5
9
Но как мне быстро получить массив array(array(1), array(5), array(9))
?
Если я сделаю:
print_r(iterator_to_array($recursive_filter_iterator));
или
print_r(iterator_to_array($recursive_filter_iterator->getInnerIterator()));
или
$it = new RecursiveIteratorIterator($recursive_filter_iterator);
print_r(iterator_to_array($it->getInnerIterator()));
Я получаю весь исходный массив:
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) [1] => Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 8 ) [2] => Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 ) )
Если я это сделаю:
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
Я получаю только первый предмет:
Array ( [0] => 9 )
Если я сделаю:
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator->getInnerIterator())));
Я получаю последний элемент в родительском массиве, но с ключом 0:
Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 )
Мне нужно получить массив:
Array ( [0] => Array ( [0] => 1 ) [1] => Array ( [0] => 5 ) [2] => Array ( [0] => 9 ) )
Я знаю, что могу сделать это вручную, но я хочу знать, есть ли прямой путь, как в iterator_to_array
для нерекурсивных итераторов. Конечно, есть кое-что, чего я не понимаю в рекурсивных итераторах в PHP, но его документация действительно плоха в этом.
Большое спасибо.