Предполагая, что нет повторяющихся имен или идентификаторов:
$ids = array();
$names = array();
foreach ($items as $item) {
$ids[$item->id] = $item;
$names[$item->name] = $item;
}
Если у вас есть дубликаты (имен; я думаю, что по определению нет дубликатов идентификаторов), вам нужно решить, как с этим обращаться. Вы можете хранить все дубликаты под одним ключом (поэтому значение становится массивом совпадений).
Или вы имеете в виду более сложный поиск? Если это так, простой вариант может состоять в том, чтобы разбить имя элемента на слова и / или фразы и затем соответствующим образом проиндексировать их в массив.