Как получить первый ключ в (возможно) ассоциативном массиве?
Какой самый эффективный способ определить первый ключ в ассоциативном массиве? Первоначально я подумал просто использовать цикл foreach
, а затем сразу же выйти из него, как показано ниже:
foreach ($an_array as $key => $val) break;
Таким образом, переменная $key
будет содержать первый ключ. Однако мне кажется, что это не очень эффективно. Есть ли у кого-то лучшее решение?
5 ответ(ов)
Функция array_keys
возвращает массив ключей. Чтобы получить первый ключ, вы можете просто взять первый элемент массива. В качестве альтернативы, вы можете использовать функцию reset
, чтобы сбросить внутренний указатель массива, а затем вызвать key
, чтобы получить текущий ключ. Тем не менее, второй подход, вероятно, будет немного быстрее (хотя я это не тестировал), но у него есть побочный эффект — он сбрасывает внутренний указатель массива.
Интересно, но цикл 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
Функция key($an_array)
вернет первый ключ массива.
Редактировано по предложению Blixt: перед вызовом key($an_array)
вам следует сначала вызвать reset($array);
, чтобы сбросить указатель массива в его начало.
Вы можете попробовать использовать следующий код:
array_keys($data)[0]
Этот код вернет первый ключ массива $data
.
В данном коде используется функция array_keys()
, которая возвращает все ключи массива $yourArray
. Затем с помощью конструкции list()
мы извлекаем первый ключ из полученного массива ключей.
Пример кода:
list($firstKey) = array_keys($yourArray);
После выполнения этого кода переменная $firstKey
будет содержать первый ключ из массива $yourArray
. Обратите внимание, что если массив пустой, то переменная $firstKey
будет неопределенной.
Если вы хотите получать ключ, не учитывая возможность пустого массива, вы можете добавить дополнительную проверку:
$keys = array_keys($yourArray);
$firstKey = !empty($keys) ? $keys[0] : null; // null, если массив пустой
Таким образом, вы можете безопасно получить первый ключ, проверив, есть ли элементы в массиве.
Сортировка двумерного массива по значению в столбце
Преобразование объекта PHP в ассоциативный массив
Удалить пустые элементы массива
Можно ли привязать массив к условию IN() в запросе PDO?
Как добавить элементы в пустой массив в PHP?