PHP массив объектов;Получить объект, где $ object-> id == 2 - PullRequest
0 голосов
/ 27 мая 2018

У меня есть класс "list_member":

class list_member
{
  public $id;
  public $email;
  public $lastchange;
  public $active;
  public $hash;
  public $list_id;

  function __construct($id,$email,$lastchange,$active,$hash,$list_id)
  {
    $this->id = $id;
    $this->email = $email;
    $this->lastchange = $lastchange;
    $this->active = $active;
    $this->hash = $hash;
    $this->list_id = $list_id;
  }
}

И у меня есть массив list_members.Теперь я хочу получить член с уникальным идентификатором ($ this-> id), например, 42.

Как это возможно без обхода всего массива и проверки каждой отдельной записи?

1 Ответ

0 голосов
/ 27 мая 2018

Одним из вариантов поиска по члену класса без поиска в массиве является индексирование свойства поиска с помощью хеш-таблицы.Это перемещает нагрузку с вашего процессора на вашу память.

Вы можете изменить свой исходный класс, включив статическую карту id и предоставив метод поиска.Поскольку id является уникальным в этом случае, я продемонстрировал проверку проверки, которая остановит выполнение, выдав исключение, если вы попытаетесь создать два члена с одинаковым значением.

class list_member
{
  public $id;
  public $email;
  private static $ids = array();

  function __construct($id,$email)
  {
    $this->id = $id;
    $this->email = $email;

    if ( array_key_exists( $id, self::$ids ) ) {
        throw new Exception('Item with id ' . $id . ' already exists.');
    }
    self::$ids[$id] = &$this;
  }

  public static function lookup_by_id($id) {
    return self::$ids[$id];
  }
}


new list_member(5, 'username1@email.com');
new list_member(15, 'username2@email.com');
new list_member(42, 'username3@email.com');
new list_member(45, 'username4@email.com');

$member = list_member::lookup_by_id(45);
echo $member->email; // username4@email.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...