2012-05-08 6 views
22

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

+3

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

+1

En outre, [Stackoverflow n'est pas votre assistant de recherche personnel] (http://meta.stackexchange.com/a/128553/164367) – vascowhite

Répondre

0

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:

+12

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

19

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.

+0

L'explication est sur le arrayIterator est tout faux. Lisez ma réponse – David

7

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.

0

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.

0

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.

Questions connexes