8

Как получить первый ключ в (возможно) ассоциативном массиве?

1

Какой самый эффективный способ определить первый ключ в ассоциативном массиве? Первоначально я подумал просто использовать цикл foreach, а затем сразу же выйти из него, как показано ниже:

foreach ($an_array as $key => $val) break;

Таким образом, переменная $key будет содержать первый ключ. Однако мне кажется, что это не очень эффективно. Есть ли у кого-то лучшее решение?

5 ответ(ов)

0

Функция array_keys возвращает массив ключей. Чтобы получить первый ключ, вы можете просто взять первый элемент массива. В качестве альтернативы, вы можете использовать функцию reset, чтобы сбросить внутренний указатель массива, а затем вызвать key, чтобы получить текущий ключ. Тем не менее, второй подход, вероятно, будет немного быстрее (хотя я это не тестировал), но у него есть побочный эффект — он сбрасывает внутренний указатель массива.

0

Интересно, но цикл foreach на самом деле является самым эффективным способом сделать это.

Поскольку автор вопроса конкретно спросил о производительности, стоит отметить, что все текущие ответы в действительности менее эффективны, чем foreach.

Я провел бенчмарк на PHP 5.4, и метод с использованием reset/key (принятый ответ) оказался примерно в 7 раз медленнее, чем foreach. Другие подходы, манипулирующие целым массивом (такие как array_keys, array_flip), явно еще более медленные и становятся гораздо хуже при работе с большими массивами.

Цикл foreach совсем не неэффективен, можете смело его использовать!

Правка 2015-03-03:

Попросили предоставить скрипты для бенчмарка. У меня нет оригинальных, но я сделал несколько новых тестов. На этот раз я обнаружил, что foreach всего лишь вдвое быстрее, чем reset/key. Я использовал массив с 100 ключами и запустил каждый метод миллион раз, чтобы получить заметное отличие. Вот код простого бенчмарка:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach для получения первого ключа и значения: " . (microtime(true) - $start) . " секунд <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key для получения первого ключа и значения: " . (microtime(true) - $start) . " секунд <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key для получения первого ключа: " . (microtime(true) - $start) . " секунд <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys для получения первого ключа: " . (microtime(true) - $start) . " секунд <br />";

На моем PHP 5.5 выводит:

foreach для получения первого ключа и значения: 0.15501809120178 секунд 
reset+key для получения первого ключа и значения: 0.29375791549683 секунд 
reset+key для получения первого ключа: 0.26421809196472 секунд 
array_keys для получения первого ключа: 10.059751987457 секунд

reset+key http://3v4l.org/b4DrN/perf#tabs

foreach http://3v4l.org/gRoGD/perf#tabs

0

Функция key($an_array) вернет первый ключ массива.

Редактировано по предложению Blixt: перед вызовом key($an_array) вам следует сначала вызвать reset($array);, чтобы сбросить указатель массива в его начало.

0

Вы можете попробовать использовать следующий код:

array_keys($data)[0]

Этот код вернет первый ключ массива $data.

0

В данном коде используется функция array_keys(), которая возвращает все ключи массива $yourArray. Затем с помощью конструкции list() мы извлекаем первый ключ из полученного массива ключей.

Пример кода:

list($firstKey) = array_keys($yourArray);

После выполнения этого кода переменная $firstKey будет содержать первый ключ из массива $yourArray. Обратите внимание, что если массив пустой, то переменная $firstKey будет неопределенной.

Если вы хотите получать ключ, не учитывая возможность пустого массива, вы можете добавить дополнительную проверку:

$keys = array_keys($yourArray);
$firstKey = !empty($keys) ? $keys[0] : null; // null, если массив пустой

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь