2009-06-08 6 views
1

J'ai écrit une classe wrapper de tableau PersonArray qui peut contenir des objets d'un certain type (Person). Chaque personne a une fonction unique getHash() qui renvoie l'ID + Name comme identifiant unique. Cela permet une récupération rapide de la personne à partir de PersonArray. Le PersonArray détient en réalité deux tableaux internes. Un pour le stockage des objets Person ($ items), et un pour le stockage des valeurs Hash ($ itemsHash).PHP - Tableau haché, insérer à l'index?

Je veux créer une fonction insertAt (index, Person) qui place l'objet Person à la position [index] dans le tableau $ items. Y a-t-il un moyen d'insérer une certaine position dans un tableau? Si oui, comment puis-je également mettre à jour le $ itemsHash du PersonArray?

class Person { 
    function getHash() { 
     return $this->id . $this->name; 
    } 
} 

class PersonArray implements Iterator { 
    public $items = array(); 
    public $itemsHash = array(); 

    public function Find($pKey) { 
     if($this->ContainsKey($pKey)) { 
      return $this->Item($this->internalRegisteredHashList[$pKey]); 
     } 
    } 

    public function Add($object) { 
     if($object->getHash()) { 
      $this->internalRegisteredHashList[$object->getHash()] = $this->Count(); 
      array_push($this->items, $object); 
     } 
    } 
    public function getItems() { 
     return $this->items; 
    } 

    function ContainsKey($pKey) {} 

    function Count() {} 

    function Item($pKey) {} 

    //Iteration implementation 
    public function rewind() {} 
    public function current() {} 
    public function key() {} 
    public function next() {} 
    public function valid() {} 
} 
+0

Questions: Je ne saisis pas complètement votre situation. Cette classe est-elle complète? Qu'est-ce que internalRegisteredHashList? Pourquoi ne pouvez-vous pas les garder indexés par leurs hachages et passer les $ items ensemble? Comment la classe regarde-t-elle réellement l'itération? Afaik Iterator est juste une interface, non? Pourriez-vous montrer un exemple de code sur la façon dont vous aimeriez utiliser cette classe et la fonction insertAt? (Détail, et pourquoi certaines fonctions commencent-elles en majuscule et d'autres non?) – 0scar

Répondre

1

Vous trouverez peut-être il est plus rapide et plus facile à utiliser des tableaux associatifs de PHP plutôt que de les re-mise en œuvre. En outre, vous pouvez également implémenter le IteratorAggregate plus simple si vous êtes en train d'itérer sur un tableau.

par exemple.

class PersonArray implements IteratorAggregate { 
    public $items = array(); 

    public function getItems() { 
     return $this->items; 
    } 

    public function Add($object) { 
     if($object->getHash()) { 
      $this->items[$object->getHash()] = $object; 
     } 
    } 

    public function Find($pKey) { 
     if(isset($this->items[$pKey])) { 
      return $this->items[$pKey]; 
     } 
    } 

    public function insertAt($index, $person) { 
     $tmp = array_slice($this->items, 0, $index); 
     $tmp[$person->getHash()] = $person; 
     $tmp = array_merge($tmp, array_slice($this->items, $index)); 

     $this->items = $tmp; 
    } 

    //IteratorAggregate implementation 
    public function getIterator() { 
     return new ArrayIterator($this->items); 
    } 
} 
+0

Mais qu'en est-il de la performance? Foreach() n'est-il pas plus lent sur une matrice associative que sur un tableau indexé? – Ropstah

+0

Je ne pense pas - http://pastebin.com/f6591bd6 –