¿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
Respuesta
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:
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
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.
La explicación es sobre el arrayIterator está todo mal. Lee mi respuesta – David
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.
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 ArrayIterator
SeekableIterator
interfaz, que puede hacer con $myArray->seek(10);
ArrayIterator
.
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.
- 1. Array PHP y ArrayObject
- 2. Diferencia entre array [n] y array []?
- 3. ¿Cuáles son los beneficios de usar SPL ArrayObject, ArrayIterator, RecursiveArrayIterator en lugar de arreglos regulares?
- 4. Diferencia entre Array.length = 0 y Array = []?
- 5. Diferencia entre Array.slice y Array(). Slice
- 6. Diferencia entre Array y ArrayCollection (Flex)
- 7. ¿Cuál es la diferencia entre array_merge y array + array?
- 8. Ruby - Diferencia entre Array # << y Array # push
- 9. Diferencia entre Javascript y PHP
- 10. Diferencia entre ByteArray y Array <Byte> en kotlin
- 11. Diferencia entre "incluir" y "requerir" en php
- 12. ¿Hay alguna diferencia entre! == y! = En PHP?
- 13. Diferencia entre NULL y nulo en PHP
- 14. ¿Diferencia entre float y double en php?
- 15. ¿Diferencia entre ruptura y continuar en PHP?
- 16. Diferencia entre objeto y clase en PHP?
- 17. ¿Cuál es la diferencia entre std :: valarray y std :: array
- 18. ¿Cuál es la diferencia entre Array (1) y el nuevo Array (1) en JavaScript?
- 19. Diferencia entre <? Php y <?
- 20. Diferencia de PHP entre Curl y HttpRequest
- 21. Diferencia de PHP entre shuffle y array_rand
- 22. PHP MYSQL - Diferencia entre 127.0.0.1 y localhost
- 23. Diferencia PHP entre enteros y enteros
- 24. diferencia entre PHP aviso y advertencia
- 25. Diferencia entre cifrado .NET y PHP
- 26. ArrayObject, getIterator();
- 27. Diferencia entre apc_add y apc_store?
- 28. ¿Cuál es la diferencia entre php cli y php cgi?
- 29. Diferencia entre Lista y matriz
- 30. SPL vs. Array: ¿Cuándo deberíamos usar SPL y cuándo debemos usar Array en PHP?
¿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
Además, [Stackoverflow no es su asistente personal de investigación] (http://meta.stackexchange.com/a/128553/164367) – vascowhite