PHP 8.5.0 Alpha 1 available for testing

iterator_to_array

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

iterator_to_array Copia un iterador en un array

Descripción

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

Copia los elementos de un iterador en un tableau.

Parámetros

iterator

El iterador a copiar.

preserve_keys

Si se deben utilizar los elementos del iterador como clave.

Si una clave es un array o un object, se generará una advertencia. Las claves null serán convertidas en una cadena vacía, las claves de tipo float serán truncadas a sus partes int, las claves de tipo resource generarán una advertencia y serán convertidas en identificador de la recurso, y las claves de tipo bool serán convertidas en enteros.

Nota:

Si este argumento no está definido o está definido en true, las claves duplicadas serán sobrescritas. El último valor con una clave dada estará en el array devuelto. Definir este argumento en false para obtener todas las valores en todo caso.

Valores devueltos

Un tableau que contiene los elementos del iterador iterator.

Historial de cambios

Versión Descripción
8.2.0 El tipo de iterator ha sido ampliado de Traversable a Traversable|array.

Ejemplos

Ejemplo #1 Ejemplo con iterator_to_array()

<?php
$iterator
= new ArrayIterator(array('recipe'=>'crêpes', 'oeufs', 'lait', 'farine'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>

El resultado del ejemplo sería:

array(4) {
  ["recipe"]=>
  string(7) "crêpes"
  [0]=>
  string(5) "oeufs"
  [1]=>
  string(4) "lait"
  [2]=>
  string(6) "farine"
}
array(4) {
  [0]=>
  string(7) "crêpes"
  [1]=>
  string(5) "oeufs"
  [2]=>
  string(4) "lait"
  [3]=>
  string(6) "farine"
}

add a note

User Contributed Notes 4 notes

up
10
wizzard351 at yahoo dot com
3 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
16 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
10 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
3
Harry Willis
10 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.
To Top