iterator_to_array
(PHP 5 >= 5.1.0, PHP 7)
iterator_to_array — Копирует итератор в массив
Описание
Копирует элементы итератора в массив.
Список параметров
-
iterator
-
Копируемый итератор.
-
use_keys
-
Следует ли использовать ключи элементов итератора как индексы.
В PHP 5.5. и новее, если ключ является массивом array или объектом object, то бросается предупреждение. Ключи со значением
NULL
преобразуются в пустую строку, ключи типа double обрезаются до их целочисленных integer частей, ключи с ресурсами resource бросают предупреждение и преобразуются в их идентификаторы ресурса, а булевы boolean ключи преобразуются в целые числа.
Возвращаемые значения
Массив (array), содержащий элементы итератора (iterator
).
Список изменений
Версия | Описание |
---|---|
5.5.0 |
iterator_to_array() стал поддерживать ключи с типами
отличными от integer и string, если включен параметр
use_keys .
|
5.2.1 |
Добавлен параметр use_keys .
|
Примеры
Пример #1 Пример использования iterator_to_array()
<?php
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>
Результат выполнения данного примера:
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" }
Коментарии
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/cb328106f393eeb28751
When 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.
Generator approach
function scandir_deep($dir)
{
foreach (scandir($dir) as $key => $value)
if (in_array($value, [".",".."]))
continue;
else if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
yield $value => scandir_deep($dir . DIRECTORY_SEPARATOR . $value);
else
yield $value;
}
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.