когато използвате итератори в 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))
?
If I do:
print_r(iterator_to_array($recursive_filter_iterator));
or
print_r(iterator_to_array($recursive_filter_iterator->getInnerIterator()));
or
$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 ) )
If I do:
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
Получавам само първия елемент:
Array ( [0] => 9 )
If I do:
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, но документацията му е наистина лоша в това отношение.
Благодаря ти много.