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() {}
}
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