PHP 8.6.0 Beta 1 is available for testing

iterator_to_array

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_to_arrayКопирует итератор в массив

Описание

function iterator_to_array(Traversable |array $iterator, bool $preserve_keys = true ): array

Копирует элементы итератора в массив.

Список параметров

iterator

Копируемый итератор.

preserve_keys

Следует ли использовать ключи элементов итератора как индексы.

Если ключ является массивом (array ) или объектом (object ), то бросается предупреждение. Ключи со значением null преобразуются в пустую строку, ключи в виде чисел с плавающей точкой (float ) обрезаются до их целочисленных (int ) частей, ключи с ресурсами (resource ) бросают предупреждение и преобразуются в их идентификаторы ресурса, а логические (bool ) ключи преобразуются в целые числа.

Замечание:

Если параметр не задан, либо задан как true , дублирующиеся ключи будут перезаписаны. Последнее значение с заданным ключом будет в результирующем массиве. Установите этот параметр равным false для получения всех значений.

Возвращаемые значения

Массив, содержащий элементы iterator.

Список изменений

Версия Описание
8.2.0 Тип параметра iterator был расширен с Traversable до Traversable |array .

Примеры

Пример #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"
}

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 4 notes

up
12
wizzard351 at yahoo dot com
4 years ago
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.
up
7
jerome at yazo dot net
17 years ago
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"
)
up
5
joksnet at gmail dot com
11 years ago
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 
up
2
Harry Willis
11 years ago
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.
+Добавить

AltStyle によって変換されたページ (->オリジナル) /