Quelqu'un peut-il expliquer clairement les différences fondamentales entre ArrayIterator
, ArrayObject
et Array en PHP en termes de fonctionnalité et de fonctionnement? Merci!Différence entre ArrayIterator, ArrayObject et Array en PHP
Répondre
Peut être vous trouverez votre réponse ici:
Cette iterator permet aux valeurs et aux touches et unset modifier tout itérer sur des tableaux et objets.
Lorsque vous voulez itérer sur le même tableau plusieurs fois dont vous avez besoin instancier ArrayObject et le laisser créer des instances ArrayIterator qui s'y réfèrent soit en utilisant foreach ou en appelant sa méthode manuelle getIterator().
A lire aussi:
Désolé, je n'ai pas clarifié ma question - Oui, j'ai lu la documentation PHP sur le trois, mais il me semble qu'ils font à peu près la même chose. Je me demandais si quelqu'un pouvait expliquer quelle était la différence entre eux et pourquoi vous choisiriez l'un plutôt que l'autre. Si ce n'est pas une question appropriée à poster ici, alors je m'excuse et s'il vous plaît n'hésitez pas à supprimer cet article! – jkhamler
Array
est un type php natif. Vous pouvez en créer un en utilisant la construction langage php array()
, ou de php 5.4 partir []
ArrayObject
est un object
qui fonctionnent exactement comme des tableaux. Ceux-ci peuvent être créés en utilisant new
mot-clé
ArrayIterator
est comme ArrayObject
mais il peut itérer sur lui-même. En outre créé à l'aide new
comparaison Array
vs (ArrayObject
/ArrayIterator
)
Ils ont tous deux peuvent être utilisés en utilisant la syntaxe de tableau du php, par exemple.
$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
Cependant, ils sont encore des objets vs tableaux, donc vous remarquerez les différences de
is_array($array); // true
is_array($object); // false
is_object($array); // false
is_object($object); // true
La plupart des fonctions de tableau php attendent des tableaux, donc en utilisant des objets il des erreurs jetteraient. Il y a beaucoup de ces fonctions. Par exemple.
sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
Enfin, les objets peuvent faire ce que vous attendez d'un objet stdClass
, à savoir l'accès aux propriétés publiques en utilisant la syntaxe objet
$object->foo = 'bar'; // works
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....
Arrays (étant le type natif) sont beaucoup plus rapides que les objets.De l'autre côté, les ArrayObject
& ArrayIterator
classes ont certaines méthodes définies que vous pouvez utiliser, alors qu'il n'y a pas une telle chose pour les tableaux
Comparaison ArrayObject
vs ArrayIterator
La principale différence entre ces 2 est dans les méthodes que les classes ont. Le ArrayIterator
implémente l'interface Iterator
qui lui donne des méthodes liées à l'itération/boucle sur les éléments. ArrayObject
a une méthode appelée exchangeArray
qui échange son tableau interne avec un autre. L'implémentation d'une chose similaire dans ArrayIterator
signifierait soit créer un nouvel objet, soit faire une boucle sur les touches & unset
en les appliquant toutes une par une & puis en définissant les éléments à partir du nouveau tableau un par un.
Ensuite, puisque le ArrayObject
ne peut itérer, lorsque vous l'utilisez en foreach
il crée un objet interne ArrayIterator
(même sous forme de tableaux). Cela signifie que php crée une copie des données originales & il y a maintenant 2 objets avec le même contenu. Cela s'avérera inefficace pour les grandes baies. Cependant, vous pouvez spécifier quelle classe utiliser pour itérateur, de sorte que vous pouvez avoir des itérateurs personnalisés dans votre code.
Espérons que cela soit utile. Les modifications à cette réponse sont les bienvenues.
L'explication est sur le arrayIterator est tout faux. Lisez ma réponse – David
ArrayObject et le tableau sont quelque peu semblables. Simplement une collection d'objets (ou types natifs). Ils ont des méthodes différentes que vous pouvez appeler, mais cela se résume essentiellement à la même chose.
Cependant, un Iterator est quelque chose d'autre complètement. Le modèle de conception de l'itérateur est un moyen de sécuriser votre tableau (le rendant uniquement lisible). Prenons l'exemple suivant:
Vous avez une classe qui a un tableau. Vous pouvez ajouter des éléments à ce tableau en utilisant addSomethingToMyArray. Notez cependant que nous faisons quelque chose à l'élément avant de l'ajouter réellement au tableau. Cela pourrait être n'importe quoi, mais laisse agir un moment comme il est très important que cette méthode soit déclenchée pour CHAQUE élément que nous voulons ajouter au tableau. Le problème avec ceci, c'est que vous passez le tableau par référence ici. Cela signifie que les classes qui utilisent réellement returnMyArray obtiennent le vrai objet myArray. Cela signifie que les classes autres que A peuvent ajouter des choses à ce tableau, et donc aussi changer le tableau dans A sans avoir à utiliser addSOmethingToMyArray. Mais nous avions besoin de faire quelque chose, tu te souviens? Ceci est un exemple d'une classe qui ne contrôle pas son propre statut interne.
La solution à ceci est un itérateur. Au lieu de passer le tableau, nous passons le tableau à un nouvel objet, qui ne peut que lire des choses du tableau. L'Iterator le plus simple est quelque chose comme ceci:
<?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;
}
}
?>
Comme vous pouvez le voir, je n'ai aucun moyen d'ajouter de nouveaux éléments au tableau donné, mais j'ai posibilités de lire le tableau comme ceci: Maintenant, il y a encore
while($iterator->hasNext())
$item = $iterator->next();
, une seule façon ajouter des éléments à myArray dans A, notamment via la méthode addSomethingToArray. Donc c'est ce qu'est un Iterator, c'est un peu un shell autour des tableaux, pour fournir quelque chose appelé encapsulation.
array
est l'un des huit types primitifs en PHP. Bien qu'il soit livré avec beaucoup de fonctions utilitaires intégrées, mais ils sont tous procéduraux.
Le ArrayObject
et le ArrayIterator
nous permettent de faire des tableaux de première classe citoyens dans un programme orienté objet (POO).
Différence entre ArrayObject
et le ArrayIterator
est que, puisque ArrayIterator
implémente l'interface SeekableIterator
, vous pouvez le faire avec $myArray->seek(10);
ArrayIterator
.
Un Iterator est un objet qui permet à un programmeur de traverser un conteneur, en particulier des listes. Différents types d'itérateurs sont souvent fournis via l'interface d'un conteneur.
Il n'y a pas beaucoup de différence entre ArrayObject
et Array
car ils représentent la même chose bien qu'utilisant différents types d'objets.
ArrayIterator
est un itérateur qui itère sur Array-like
objets, cela inclut tous les objets qui mettent en œuvre ArrayAcess
et le type Array
natif. En fait, lorsque vous foreach
sur un tableau, PHP crée en interne ArrayIterator
pour faire le déplacement et transformer votre code pour regarder comme si tapé cela,
for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
vous pouvez donc voir tous les objets de collection a un itérateur sauf pour vos collections définies dont vous avez besoin pour définir vos propres Iterators.
- 1. PHP Array et ArrayObject
- 2. php: différent entre array() {} et
- 3. Différence entre | et || en PHP
- 4. Différence entre Array.length = 0 et Array = []?
- 5. Détruire un ArrayObject en PHP
- 6. Comment fonctionne ArrayObject en PHP?
- 7. Différence entre new_array $ = array() et $ new_array = []
- 8. Différence entre "new Array (..)" et "[..]" dans JavaScript?
- 9. json_encode comportement différent sur ArrayObject vs array()
- 10. Quelle est la différence entre array [ROWS] [COLS] et ** array
- 11. Quels sont les avantages de l'utilisation de SPL ArrayObject, ArrayIterator, RecursiveArrayIterator au lieu de tableaux réguliers?
- 12. Quelle est la différence entre Math et Array en Javascript?
- 13. Différence entre datetimes en PHP et MySQL
- 14. PHP: Différence entre -> et ::
- 15. php Différence entre -> et
- 16. Quelle est la différence entre getRuntime(). Exec (php hello.php) et getRuntime(). Exec (array) en Java?
- 17. Quelle est la différence entre Array (1) et new Array (1) en JavaScript?
- 18. ArrayObject PHP étendu ne fonctionne pas correctement
- 19. Différence entre array ('Acl' => array ('type' => 'requester')) et array ('Acl' => 'requester') dans CakePHP?
- 20. Différence entre Seq et Array pour la valeur de tableau
- 21. Différence entre chaîne créée par array et pointeur?
- 22. Différence entre ByteArray et Array <Byte> dans kotlin
- 23. quelle est la différence entre array linéaire et multidimensionnel?
- 24. Quelle est la différence entre la représentation list/array [] et {}?
- 25. Ruby passant des arguments: différence entre Array et Set
- 26. Quelle est la différence entre malloc et array
- 27. Array & Session - Différent entre 'var' et $ var
- 28. Différence entre PHP et Java Unix Horodatage
- 29. PHP différence entre shuffle et array_rand
- 30. PHP Différence entre Curl et HttpRequest
Avez-vous lu [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) et [Array] (http: // www. php.net/Array)? C'est probablement toute l'information dont vous aurez besoin. – vascowhite
En outre, [Stackoverflow n'est pas votre assistant de recherche personnel] (http://meta.stackexchange.com/a/128553/164367) – vascowhite