Nous allons implémenter l’interface ArrayAccess. Donc notre liste chainée va se comporter comme un array.
Je vais rajouter deux méthodes. Attention les Array commencent traditionnellement à 0 d’où le $this->count -1
Supprimer le chainon N
12345678910111213141516171819202122232425
publicfunctionremoveAtPosition($position){if(!$this->validateInterval($position)){thrownew\Exception("L'index doit être valide");}if($position==0){return$this->removeFirstValue();}if($position==$this->count-1){return$this->removeLastValue();}$current=$this->first;$last=$current;for($i=0;$i<$position;$i++){$last=$current;$current=$current->getNext();}$last->setNext($current->getNext());return$this;}
Récupérer le chainon N
1234567891011121314151617181920
publicfunctiongetAtPosition($position){if(!$this->validateInterval($position)){thrownew\Exception("L'index doit être numerique");}if($position==0){return$this->first->getData();}if($position==$this->count-1){return$this->last->getData();}$current=$this->first;for($i=0;$i<$position;$i++){$current=$current->getNext();}return$current->getData();}
Pour avoir le 9999 chainon, il faut parcourir les 9998 chainons précédents.
Avec les deux méthodes précédentes. Il suffit d’implémenter les méthodes suivantes
123456789101112131415161718192021222324
publicfunctionoffsetSet($offset,$value){if($offset==null){$this->insertAtEnd($value);}else{if(!$this->validateInterval($offset)){thrownew\Exception("L'index doit être valide");}$this->insertAtPosition($offset,$value);}}publicfunctionoffsetExists($offset){return$this->validInterval($offset);}publicfunctionoffsetUnset($offset){return$this->removeAtPosition($offset);}publicfunctionoffsetGet($offset){return$this->getAtPosition($offset);}
Pour vérifier que les valeurs en entrée sont correctes j’utilise la fonction suivante
Pour faire dans l’autre sens nous pouvons implémenter le constructor
1234567891011
publicfunction__construct($input=null){if($input){if(!(is_array($input)||$inputinstanceofTraversable)){thrownew\Exception("Un array ou Un iterator..");}foreach($inputas$value){$this->insertAtEnd($value);}}}
Mon constructor prend un array ou un Objet qui implémente Traversable (en gros un Itérateur);
Nous avons implémenter Les listes chainées avec toutes les méthodes. Mon exemple est un peu théorique. Mais je vous conseille de re-regarder les doctrines collections.