example array php arrays arrayobject arrayiterator

example - Diferencia entre ArrayIterator, ArrayObject y Array en PHP



array iterator java (5)

¿Alguien puede explicar claramente las diferencias fundamentales entre ArrayIterator , ArrayObject y Array en PHP en términos de funcionalidad y operación? ¡Gracias!


ArrayObject y array son algo parecidos. Simplemente una colección de objetos (o tipos nativos). Tienen algunos métodos diferentes a los que puedes llamar, pero en su mayoría se reduce a lo mismo.

Sin embargo, un iterador es algo completamente distinto. El patrón de diseño del iterador es una forma de asegurar su matriz (haciéndola solo legible). Tomemos el siguiente ejemplo:

Tienes una clase que tiene una matriz. Puede agregar elementos a esa matriz utilizando addSomethingToMyArray. Sin embargo, tenga en cuenta que hacemos algo para crear un elemento antes de agregarlo a la matriz. Esto podría ser cualquier cosa, pero actuemos por un momento como si fuera muy importante que este método se active para CADA elemento que deseamos agregar a la matriz.

class A { private $myArray; public function returnMyArray() { return $this->myArray; } public function addSomethingToMyArray( $item ) { $this->doSomethingToItem( $item ); array_push( $item ); } }

El problema con esto, es que pasa la matriz por referencia aquí. Eso significa que las clases que realmente usan returnMyArray obtienen el objeto myArray real. Eso significa que las clases que no sean A pueden agregar cosas a esa matriz y, por lo tanto, también cambiar la matriz dentro de A sin tener que usar addSOmethingToMyArray. Pero necesitábamos hacer algo, ¿recuerdas? Este es un ejemplo de una clase que no tiene control de su propio estado interno.

La solución a esto es un iterador. En lugar de pasar la matriz, pasamos la matriz a un nuevo objeto, que solo puede LEER cosas de la matriz. El iterador más simple que existe es algo como esto:

<?php class MyIterator{ private $array; private $index; public function __construct( $array ) { $this->array = $array; } public function hasNext() { return count( $this->array ) > $this->index; } public function next() { $item = $this->array[ $this->index ]; this->$index++; return $item; } }

?>

Como puede ver, no tengo forma de agregar nuevos elementos a la matriz dada, pero sí tengo la posibilidad de leer la matriz de esta manera:

while( $iterator->hasNext() ) $item = $iterator->next();

Ahora, nuevamente, solo hay una forma de agregar elementos a myArray en A, a saber, mediante el método addSomethingToArray. Así que eso es lo que es un iterador, es algo así como una cáscara alrededor de las matrices, para proporcionar algo que se llama encapsulación.


Puede que encuentres tu respuesta aquí:

Este iterador permite desarmar y modificar valores y claves mientras se itera sobre Arrays y Objetos.

Cuando quiera iterar sobre la misma matriz varias veces, necesita crear una instancia de ArrayObject y dejar que cree instancias de ArrayIterator que se refieran a ella usando foreach o llamando a su método getIterator () manualmente.

También lea:


Un Iterator es un objeto que permite a un programador atravesar un contenedor, particularmente listas. A menudo se proporcionan varios tipos de iteradores a través de la interfaz de un contenedor.

No hay mucha diferencia entre ArrayObject y Array ya que representan las mismas cosas, aunque utilizan diferentes tipos de objetos.

ArrayIterator es un iterador que itera sobre objetos Array-like , esto incluye todos los objetos que implementan ArrayAcess y el tipo de Array nativo. De hecho, cuando foreach sobre una matriz, PHP crea internamente ArrayIterator para realizar el desplazamiento y transformar su código para que parezca que ha escrito esto.

for( $arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator- >next()) { $key = $arrayIteartor->key(); $value = $arrayIterator->current(); }

Como puede ver, cada objeto de colección tiene un iterador, excepto las colecciones definidas para las que necesita definir sus propios iteradores.


Array es un tipo de php nativo. Puede crear uno usando la array() construcción del lenguaje php array() , o a partir de php 5.4 en adelante []

ArrayObject es un object que funciona exactamente como matrices. Estos pueden ser creados usando una new palabra clave

ArrayIterator es como ArrayObject pero puede iterar sobre sí mismo. También creado usando new

Comparando Array vs ( ArrayObject / ArrayIterator )

Ambos se pueden utilizar utilizando la sintaxis de la matriz de php, por ejemplo.

$array[] = ''foo''; $object[] = ''foo''; // adds new element with the expected numeric key $array[''bar''] = ''foo''; $object[''bar''] = ''foo''; // adds new element with the key "bar" foreach($array as $value); foreach($object as $value); // iterating over the elements

Sin embargo, siguen siendo objetos contra matrices, por lo que notaría las diferencias en

is_array($array); // true is_array($object); // false is_object($array); // false is_object($object); // true

La mayoría de las funciones de matriz php esperan matrices, por lo que usar objetos arrojaría errores. Hay muchas de esas funciones. Por ejemplo.

sort($array); // works as expected sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......

Finalmente, los objetos pueden hacer lo que cabría esperar de un objeto stdClass , es decir, acceder a las propiedades públicas mediante la sintaxis del objeto.

$object->foo = ''bar''; // works $array->foo = ''bar''; // Warning: Attempt to assign property of non-object in ....

Las matrices (siendo el tipo nativo) son mucho más rápidas que los objetos. Por otro lado, las clases ArrayObject y ArrayIterator tienen ciertos métodos definidos que puede usar, mientras que no existe tal cosa para los arreglos.

Comparando ArrayObject vs ArrayIterator

La principal diferencia entre estos 2 está en los métodos que tienen las clases.

El ArrayIterator implementa la interfaz ArrayIterator que le proporciona métodos relacionados con la iteración / bucle sobre los elementos. ArrayObject tiene un método llamado exchangeArray que intercambia su matriz interna con otra. Implementar algo similar en ArrayIterator significaría crear un nuevo objeto o pasar por las teclas y unset todas una por una y luego configurar los elementos de la nueva matriz uno por uno.

A continuación, dado que el ArrayObject no puede ser iterado, cuando lo usa en foreach crea un objeto ArrayIterator internamente (igual que los arreglos). Esto significa que php crea una copia de los datos originales y ahora hay 2 objetos con el mismo contenido. Esto resultará ser ineficiente para matrices grandes. Sin embargo, puede especificar qué clase usar para el iterador, por lo que puede tener iteradores personalizados en su código.

Espero que esto sea de ayuda. Las ediciones a esta respuesta son bienvenidas.


array es uno de los ocho tipos primitivos en PHP. Aunque viene con muchas funciones de utilidad incorporadas, pero todas son de procedimiento.

Tanto ArrayObject como ArrayIterator nos permiten crear matrices de ciudadanos de primera clase en un programa orientado a objetos (OOP).

La diferencia entre ArrayObject y ArrayIterator es que, dado que ArrayIterator implementa la interfaz SeekableIterator , puede hacer $myArray->seek(10); con ArrayIterator .