PHP - хэшированный массив, вставить в индекс? - PullRequest
1 голос
/ 08 июня 2009

я написал массив-оболочку класса PersonArray, который может содержать объекты определенного типа (Person). У каждого человека есть уникальная функция getHash (), которая возвращает идентификатор + имя в качестве уникального идентификатора. Это позволяет быстро получить Person из PersonArray. PersonArray фактически содержит два внутренних массива. Один для хранения объектов Person ($ items), а другой для хранения значений Hash ($ itemsHash).

Я хочу создать функцию insertAt (index, Person), которая помещает объект Person в позицию [index] в массиве $ items. Есть ли способ вставить определенную позицию в массив? Если да, то как мне также обновить $ itemsHash для 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() {}
}

1 Ответ

1 голос
/ 08 июня 2009

Вы можете обнаружить, что быстрее и проще использовать ассоциативные массивы PHP, а не заново их реализовывать.

Кроме того, вы также можете реализовать более простой IteratorAggregate, если вы на самом деле просто перебираете массив.

, например

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);   
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...