при использовании итераторов в PHP вы можете использовать функцию iterator_to_array
для получения извлечения массива, полученного в результате итерации. Например, предположим, что у вас есть следующие ArrayObject
:вид iterator_to_array для рекурсивного итератора для получения двумерного массива
$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, но его документация в этом плохо.
Большое спасибо.
* «его документация очень плохая» * - любая обратная связь по этой теме приветствуется, пришлите мне электронное письмо (мое имя пользователя на SO, @ php.net). – salathe