Чтобы индексом было имя - стоит подумать. Подумать раз 50, прежде чем такое реализовывать.
Если индекс - число, то i - элемент массива получается так:
Код:
element := (array + i * sizeof(element))^;
Одно умножение, одно сложение и одно взятие по адресу. 3 операции.
А если индекс - произвольные данные, то единственный способ использовать таков (на псевдокоде):
Код:
для каждого элемента из массива проверить
если текущий_элемент.индекс = нужный_индекс то
element := текущий_элемент
И посчитай количество операций, которое понадобится для получения значения, если будет массив например из 75000 элементов. И особенно это касается строк, т.к. сравнение строк - это сравнение всех их символов. Так что лишний раз не стоит это использовать и в пхп (хотя, наверное, там есть ускорение в виде хешей, однако это все равно далекоооо не 3 операции).
По поводу динамического создания массивов:
Ничто не мешает сделать
1) Создать массив/список указателей на массивы. Изначально все нули. По мере надобности создается массив и его адрес добавляется в этот массив/список.
2) Если нужно только временное пользование, то просто сделать один указатель на массив, для которого выделять память нужного размера.