Как узнать номер индекса в ассоциативном массиве?

Статус
В этой теме нельзя размещать новые ответы.

xintrea

Новичок
Как узнать номер индекса в ассоциативном массиве?

Здравствуйте.

А есть ли в PHP такая готовая функция, которая возвращает номер индекса в ассоциативном массиве? То есть что надо. Есть ассоциативный массив

$a['hello']='привет';
$a['word']='мир';
$a['apple']='яблоко';
$a['cherry']='вишня';
$a['book']='книга';
и т.д.

Нужно узнать, какой числовой индекс имеет элемент с указанным ассоциативным индексом. То есть нужно узнать тот числовой индекс, который по мере добавления элементов в ассоциативный массив, увеличивается...

Пример: $a['apple'] будет иметь индекс 2 (если считать с 0), $a['book'] ,будет иметь 4. Вот как эти цифири узнать?

Причем узнать это нужно максимально быстро! Мотать PHP-кодом цикл по элементам и инкрементировать индекс пока не встретится элемент с нужным ассоциативным индексом - это слишком медленно. Может, есть готовая функция?
 

Андрейка

Senior pomidor developer
$a['apple'] будет иметь индекс 2 (если считать с 0)
о! вот оно оказывается как... а ты де про это читал?
 

StUV

Rotaredom
http://ru.php.net/manual/en/language.types.array.php
An array in PHP is actually an ordered map. A map is a type that maps values to keys. This type is optimized in several ways, so you can use it as a real array, or a list (vector), hashtable (which is an implementation of a map), dictionary, collection, stack, queue and probably more. Because you can have another PHP array as a value, you can also quite easily simulate trees.
 

StUV

Rotaredom
Мотать PHP-кодом цикл по элементам и инкрементировать индекс пока не встретится элемент с нужным ассоциативным индексом - это слишком медленно
что-то здесь не так... объясни задачу - что ты хочешь сделать ?
 

xintrea

Новичок
Ничего не понял.

Вот если создать ассоциативный массив, потом его напечатать через print_r(), то элементы будут напечатаны в порядке добавления элементов в массив.

Следовательно, каким-то образом можно узнать, какой числовой индекс имеет элемент с ассоциативным индексом.

Это можно узнать, мотая foreach() и крутя параллельно счетчик элементов, пока не встретится элемент с нужным ассоциативным ключем. Но это линейный поиск, он медленный, и к томуже реализуется PHP-кодом.

А нужен быстрый, возможно уже реализованый в PHP в виде функции. Или такой функции нет?
 

tf

крылья рулят
Следовательно, каким-то образом можно узнать, какой числовой индекс имеет элемент с ассоциативным индексом.
xintrea, ты чтонибуть о списках в программированиии слышал?
 

Андрейка

Senior pomidor developer
какой числовой индекс имеет элемент
какой номер по порядку, а не индекс.. а номера по порядку находятся перебором (массива, ключей (см.выше)...)
 

xintrea

Новичок
Объясняю задачу. Вот рабочий пример.

PHP:
$a['hello']='привет';
$a['word']='мир';
$a['apple']='яблоко';
$a['cherry']='вишня';
$a['book']='книга';

echo getrealindex($a,'apple');

function getrealindex($a,$n)
{
 $i=0;
 foreach($a as $key => $value)
 {
  if($key==$n)return $i;
  $i++;
 }

 return -1;
}
Функция getrealindex() для элемента 'hello' возвращает 0,
для элемента 'word' возвращает 1,
для элемента 'apple' возвращает 2,
для элемента 'cherry' возвращает 3,
для элемента 'book' возвращает 4.


Нужен аналог этой функции. Есть в PHP такая в природе или нет? Или как можно ускорить действие, совершаемое этой функцией?
 

Frol

Новичок
а зачем тебе понадобился этот "реальный индекс"?
 

tf

крылья рулят
xintrea
Нужен аналог этой функции. Есть в PHP такая в природе или нет? Или как можно ускорить действие, совершаемое этой функцией?
ускорить - написать твой код
 

xintrea

Новичок
Ну вот понадобился. Думал, что это не будет проблемой.

Если ассоциативный массив внутренне представляется в виде списка, то должна же быть функция, которая делает поиск по списку и возвращает номер элемента в списке... Вот он-то мне и нужен. А функции такой оказывается нет. А если массив большой, то вести поиск в массиве PHP-кодом очень неэффективно.

-~{}~ 03.10.06 15:08:

Автор оригинала: tf
xintrea

ускорить - написать твой код
Что имеется в виду?
 

hermit_refined

Отшельник
> Ну вот понадобился.
А зачем? Что Вы с ним потом-то будете делать?..

А получить такой никому не нужный индекс можно:
$a_keys = array_keys($a);
$index_of_apple = array_search('apple', $a_keys);
 

xintrea

Новичок
Автор оригинала: hermit_refined
> Ну вот понадобился.
А зачем? Что Вы с ним потом-то будете делать?..

А получить такой никому не нужный индекс можно:
$a_keys = array_keys($a);
$index_of_apple = array_search('apple', $a_keys);
Во! То что нужно. Уже работает. Спасибо.

Делать буду, ну как сказать... генерировать строку в соответствии с позициями. Для этого и нужны эти никому ненужные индексы. Причем regexp тут не применишь, у меня другое..
 

StUV

Rotaredom
Делать буду, ну как сказать... генерировать строку в соответствии с позициями.
зачем?
возможно ты избрал изначально неверный путь решения свое задачи - расскажи подробнее зачем тебе это - скорее всего есть не_кривое решение
 

xintrea

Новичок
Тута я, думаю как бы попроще сфармулировать. Проще видимо не получица, потому что ето - внутренности самопального движка, который использует текстовые БД с разделителями, и свой формат "конфигурации" баз данных.

При сопоставлении структуры данных в "конфигурации" (описание поля базы данных), нужно ее соответствие с позицией в строке-записи текстовой БД. Вот для этого и использую "реальный" индекс, так как обращение к полю идет через имя, нужно знать в каком месте хранятся (после какого по счету разделителя если хотите) хранятся нужные данные.

Впринципе, вы можете посмотреть здесь
http://xi.net.ru/sint.php?npage=0,

и почитать вот эту новость
http://xi.net.ru/news.php?zoom=96
 

tf

крылья рулят
xintrea :~)
В результате получилась цифра, которую страшно назвать. Выполнение скриптов ускорилось в 10 раз! Если раньше под профилером скрипт печати страницы форума выполнялся за 1000-1200мс, то сейчас это время под профилером составляет 80-100мс.
нетуж спасибо, нам и так неплохо на своем
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху