2012-05-08 34 views
22

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

+3

¿Has leído [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) y [Array] (http: // www. php.net/Array)? Esa es probablemente toda la información que necesitará. – vascowhite

+1

Además, [Stackoverflow no es su asistente personal de investigación] (http://meta.stackexchange.com/a/128553/164367) – vascowhite

Respuesta

0

Puede ser que usted encontrará su respuesta aquí:

Este iterador permite desarmar y modificar los valores y las teclas mientras iterar sobre matrices y objetos.

Cuando se desea iterar sobre la misma matriz de múltiples tiempos que necesita para crear una instancia ArrayObject y dejar que se crean instancias ArrayIterator que hacen referencia a ella, ya sea mediante el uso de foreach o llamando a su método getIterator() manualmente.

Lea también:

+12

Lamento no haber aclarado mi pregunta - Sí, he leído la documentación de PHP en el tres, pero me parece que hacen casi lo mismo. Me preguntaba si alguien podría explicar cuál era la diferencia real entre ellos y por qué elegirías uno sobre el otro. Si esta no es una pregunta adecuada para publicar aquí, me disculpo y no dude en eliminar esta publicación. – jkhamler

19

Array es un tipo php nativa. Puede crear uno utilizando el lenguaje PHP construir array(), o A partir de PHP 5.4 en adelante []

ArrayObject es un object que funciona exactamente igual que las matrices. Estos pueden crearse usando la palabra clave new

ArrayIterator es como ArrayObject pero puede iterarse sobre sí mismo. También creó usando new


Comparando Array vs (ArrayObject/ArrayIterator)

Ambos pueden ser utilizados usando sintaxis de arrays de la 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, no dejan de ser objetos vs matrices, por lo que se daría cuenta de las diferencias en

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

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

La mayor parte del PHP funciones de matriz esperan matrices, por lo que el uso de objetos no se generan errores. Hay muchas funciones similares. Por ej.

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

Por último, los objetos pueden hacer lo que se puede esperar de un objeto stdClass, es decir, acceder a las propiedades públicas utilizando la sintaxis de objetos

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

matrices (siendo el tipo nativo) son mucho más rápidos que los objetos.Por otro lado, los ArrayObject & ArrayIterator clases han ciertos métodos definidos que se puede utilizar, mientras que no hay tal cosa para matrices


Comparando ArrayObject vs ArrayIterator

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

El ArrayIterator implementa la interfaz Iterator que le da los 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 una cosa similar en ArrayIterator significaría crear un nuevo objeto o recorrer las teclas & unset ing todas ellas una por una & y luego establecer los elementos de la nueva matriz uno a uno.

A continuación, ya que el ArrayObject no se pueden repetir, cuando se utiliza en foreach crea un objeto ArrayIterator internamente (igual que las matrices). Esto significa que php crea una copia de los datos originales &; ahora hay 2 objetos con los mismos contenidos. Esto demostrará ser ineficiente para arreglos grandes. Sin embargo, puede especificar qué clase usar para el iterador, para que pueda tener iteradores personalizados en su código.


Espero que esto sea útil. Las ediciones de esta respuesta son bienvenidas.

+0

La explicación es sobre el arrayIterator está todo mal. Lee mi respuesta – David

7

ArrayObject y array son algo similares. Simplemente una colección de objetos (o tipos nativos). Tienen algunos métodos diferentes 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). Veamos el siguiente ejemplo:

Tienes una clase que tiene una matriz. Puede agregar elementos a esa matriz usando addSomethingToMyArray. Sin embargo, tenga en cuenta que hacemos algo al elemento antes de que realmente lo agreguemos a la matriz. Esto podría ser cualquier cosa, pero permitamos por un momento actuar como si fuera muy importante que este método se active para TODOS los elementos que queremos 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 verdadero objeto myArray. 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 el addSOmethingToMyArray. Pero necesitábamos hacer TOAME TOItem, ¿recuerdas? Este es un ejemplo de una clase que no tiene el 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 elementos de la matriz. El iterador más simple de todos los tiempos 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 se puede ver, no tengo manera de añadir nuevos elementos a la matriz dada, pero tengo posibilidades de leer la matriz de esta manera:

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

Ahora hay de nuevo, de una sola manera para agregar elementos a myArray en A, a través del método addSomethingToArray. Entonces, eso es lo que es un iterador, es algo así como un shell en torno a las matrices, para proporcionar algo llamado encapsulación.

0

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

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

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

0

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

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

ArrayIterator es un iterador que itera sobre Array-like objetos, esto incluye todos los objetos que implementan ArrayAcess y el nativo Array tipo. De hecho, cuando se foreach sobre una matriz, PHP crea internamente ArrayIterator para hacer el desplazamiento y transformar su código a parecer como si tecleado esto,

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

Así se puede ver, cada objeto de la colección tiene un iterador a excepción de sus colecciones definidas para las cuales necesita definir sus propios iteradores.

Cuestiones relacionadas