вид iterator_to_array для рекурсивного итератора для получения двумерного массива

при использовании итераторов в 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, но его документация в этом действительно плохая.

Большое спасибо.

5
задан hakre 12 July 2012 в 16:53
поделиться