Единственный способ, которым я могу представить, что не включает итерацию массива для каждого поиска (см. Ответ Джейкоба), это хранить ссылки на каждый элемент в двух массивах.
Редактировать :Поскольку URL-адреса и идентификаторы не могут конфликтовать друг с другом, они могут храниться в одном и том же ссылочном массиве (спасибо Мэтью)
$items; // array of item objects
// Use objects so they're implicitly passed by ref
$itemRef = array();
foreach ($items as $item) {
$itemRef[$item->unique_id] = $item;
$itemRef[$item->url] = $item;
}
// find by id
$byId = $itemRef[$id];
// find by url
$byUrl = $itemRef[$url];
Вероятно, вы могли бы инкапсулировать это, используя класс коллекции, реализующий getById()
и getByUrl()
.Внутренне он может хранить ссылки в любом количестве массивов, сколько необходимо.
Конечно, здесь вы, по сути, делаете создание индексированных наборов результатов, что лучше оставить системам управления базами данных.