iterator_to_array

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

iterator_to_arrayCopiar el iterador a un array

Descripción

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

Copia los elementos de un iterador a un array.

Parámetros

iterator

El iterador a copiar.

use_keys

Si usar las claves del elemento iterador como índice.

En PHP 5.5 y posterior, si una clave es un array u object, se generará una advertencia. Las claves null serán convertidas a un string vacío, las claves float serán truncadas a su equivalente integer, las claves resource generarán una advertencia y serán convertidas a sus ID de recurso, y las claves boolean serán convertidas a enteros.

Nota:

Si no se establece este parámetro o se establece a true, las claves duplicadas serán sobrescritas. El último valor con una clave dada estará en el array devuelto. Para obtener todos los valores en cualquier caso, se ha de establecer este parámetro a false.

Valores devueltos

Un array que contiene los elementos del iterator.

Historial de cambios

Versión Descripción
5.5.0 iterator_to_array() da soporte a tipos de claves diferentes a integer y string cuando el parámetro use_keys está habilitado.
5.2.1 Añadido el parámetro use_keys.

Ejemplos

Ejemplo #1 Ejemplo de iterator_to_array()

<?php
$iterator
= new ArrayIterator(array('recipe'=>'panqueques', 'huevo', 'leche', 'harina'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>

El resultado del ejemplo sería:

array(4) {
  ["recipe"]=>
  string(10) "panqueques"
  [0]=>
  string(5) "huevo"
  [1]=>
  string(5) "leche"
  [2]=>
  string(6) "harina"
}
array(4) {
  [0]=>
  string(10) "panqueques"
  [1]=>
  string(5) "huevo"
  [2]=>
  string(5) "leche"
  [3]=>
  string(6) "harina"
}

add a note add a note

User Contributed Notes 6 notes

up
4
wizzard351 at yahoo dot com
2 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
6
jerome at yazo dot net
15 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
4
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
9 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.
up
-5
chad 0x40 herballure 0x2e com
16 years ago
The use_keys parameter was added in one of the 5.2.x releases; it defaults to TRUE. This matches the behavior in PHP 5.1.6, which lacks this parameter.
up
-3
enelar at develop-project dot ru
7 years ago
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;
}
To Top