One important thing to remember is that in iterator can be infinite. Not all iterators necessarily end. If iterator_to_array is used on such an iterator, it will exhaust the available memory, and throw a fatal error.
For example, consider the following code:
<?php
function fibonacci(): Generator
{
yield $a = 1;
yield $b = 2;
start:
yield $c = $a + $b;
$a = $b;
$b = $c;
goto start;
}
$fibonacciSequence = fibonacci();
iterator_to_array($fibonacciSequence);
?>
Since <?php fibonacci(); ?> generates an infinite fibonacci sequence, which is valid, since it is actually an infinite sequence, then attempting to convert it to an array will fail.iterator_to_array
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
iterator_to_array
Референца за `function.iterator-to-array.php` со подобрена типографија и навигација.
iterator_to_array
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
iterator_to_array — Копирај го итераторот во низа
= NULL
Копирај ги елементите од итератор во низа.
Параметри
iterator-
Итераторот што се копира.
preserve_keys-
Дали да се користат клучевите на елементите на итераторот како индекс.
Ако клучот е array or object, ќе се генерира предупредување.
nullклучевите ќе се претворат во празен стринг, float клучевите ќе бидат скратени до нивните int соодветни, resource клучевите ќе генерираат предупредување и ќе се претворат во нивниот ресурс ID, и bool клучевите ќе се претворат во цели броеви.Забелешка:
Ако овој параметар не е поставен или е поставен на
true, дупликат клучевите ќе бидат презапишани. Последната вредност со даден клуч ќе биде во вратената array. Поставете го овој параметар наfalseза да ги добиете сите вредности во секој случај.
Вратени вредности
Еден array што ги содржи елементите од iterator.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.2.0 |
Типот на iterator е проширен од
Траверзабилно to
Траверзабилно|array.
|
Примери
Пример #1 iterator_to_array() example
<?php
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(4) {
["recipe"]=>
string(8) "pancakes"
[0]=>
string(3) "egg"
[1]=>
string(4) "milk"
[2]=>
string(5) "flour"
}
array(4) {
[0]=>
string(8) "pancakes"
[1]=>
string(3) "egg"
[2]=>
string(4) "milk"
[3]=>
string(5) "flour"
}
Белешки од корисници 4 белешки
Using the boolean param :
<?php
$first = new ArrayIterator( array('k1' => 'a' , 'k2' => 'b', 'k3' => 'c', 'k4' => 'd') );
$second = new ArrayIterator( array( 'k1' => 'X', 'k2' => 'Y', 'Z' ) );
$combinedIterator= new AppendIterator();
$combinedIterator->append( $first );
$combinedIterator->append( $second );
var_dump( iterator_to_array($combinedIterator, false) );
?>
will output :
array(7) (
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "X"
[5]=>
string(1) "Y"
[6]=>
string(1) "Z"
)
<?php
var_dump( iterator_to_array($combinedIterator, true) );
?>
will output (since keys would merge) :
array(5) (
["k1"]=>
string(1) "X"
["k2"]=>
string(1) "Y"
["k3"]=>
string(1) "c"
["k4"]=>
string(1) "d"
[0]=>
string(1) "Z"
)To generate an deep array from nested iterators:
<?php
function iterator_to_array_deep(\Traversable $iterator, $use_keys = true) {
$array = array();
foreach ($iterator as $key => $value) {
if ($value instanceof \Iterator) {
$value = iterator_to_array_deep($value, $use_keys);
}
if ($use_keys) {
$array[$key] = $value;
} else {
$array[] = $value;
}
}
return $array;
}
?>
I use it to test an iterator: https://gist.github.com/jm42/cb328106f393eeb28751When using iterator_to_array() on an SplObjectStorage object, it's advisable to set $use_keys to false.
The resulting array is identical, since the iterator keys produced by SplObjectStorage::key() are always integers from 0 to (COUNT-1). Passing $use_keys=false cuts out the unnecessary calls to SplObjectStorage::key(), giving a slight performance advantage.