Какой лучший способ определить первый ключ в возможно ассоциативном массиве? Сначала я подумал, что нужно просто просмотреть массив, а затем сразу же разбить его, вот так:
foreach ($an_array as $key => $val) break;
Таким образом, наличие ключа $ содержит первый ключ, но это кажется неэффективным. У кого-нибудь есть лучшее решение?
foreach
семантически неверен.each($arr)['key']
илиeach($arr)[0]
будет работать.0.0107
foreach:0.0217
Ответы:
2019 Обновление
Начиная с PHP 7.3 , появилась новая встроенная функция,
array_key_first()
которая будет извлекать первый ключ из данного массива без сброса внутреннего указателя. Проверьте документацию для получения дополнительной информации.Вы можете использовать
reset
иkey
:По сути, это то же самое, что и ваш исходный код, но с немного меньшими накладными расходами, и более очевидно, что происходит.
Просто не забудьте позвонить
reset
, или вы можете получить любой из ключей в массиве. Вы также можете использоватьend
вместо того,reset
чтобы получить последний ключ.Если вы хотите, чтобы ключ получил первое значение,
reset
фактически возвращает его:Однако следует обратить внимание на один особый случай (поэтому сначала проверьте длину массива):
источник
reset()
также случается, что возвращается первый элемент (значение, а не ключ) любого массива, что также может быть удобно.reset()
сказатьDon't use
reset () `, чтобы получить первое значение ассоциативного массива. Он отлично работает для истинных массивов, но неожиданно работает с объектами Iterator. bugs.php.net/bug.php?id=38478 `Это все еще правда? Я в замешательствеarray
объектах, а о пользовательских объектах (которые не являются реальными массивами). Я предполагаю, что они запутали разницу в структурах данных, но в основномreset
возвращает значение первого «ключа», который для объектов был бы$prop
в примере, приведенном в отчете «ошибка», но для массива - первый ключ. Так что не волнуйтесь, пока вы используете реальные массивы (созданные с помощьюarray(…)
), у вас не будет проблем.next
,reset
,end
или сквозным через массив), вы не получите ожидаемое значение при вызовеkey
. Так что да, всегда звонитеreset
перед использованием,key
чтобы убедиться, что вы получите то, что хотите.array_keys
возвращает массив ключей. Возьми первую запись. В качестве альтернативы, вы можете вызватьreset
массив, а затемkey
. Последний подход, вероятно, немного быстрее (хотя я его не тестировал), но имеет побочный эффект сброса внутреннего указателя.источник
foreach
+break
иreset
+ наkey
самом деле. Но первое выглядит довольно странно, поэтому для стилистических вопросов я бы предпочел второе.foreach
что не создает для него внутреннюю копию, а просто выполняет итерацию указателя , аналогично использованию более низкого уровняnext
иcurrent
т. д.Интересно, что цикл foreach на самом деле является наиболее эффективным способом сделать это.
Поскольку ОП конкретно спрашивает об эффективности, следует отметить, что все текущие ответы на самом деле гораздо менее эффективны, чем foreach.
Я сделал тест на это с php 5.4, и метод указателя сброса / ключа (принятый ответ), кажется, примерно в 7 раз медленнее, чем foreach. Другие подходы, манипулирующие всем массивом (array_keys, array_flip), очевидно, даже медленнее этого и становятся намного хуже при работе с большим массивом.
Foreach не является неэффективным, не стесняйтесь использовать его!
Изменить 2015-03-03:
Запрошены эталонные скрипты, у меня нет оригинальных, но вместо этого я провел несколько новых тестов. На этот раз я нашел foreach только в два раза быстрее, чем кнопка сброса / нажатия. Я использовал массив из 100 ключей и запускал каждый метод по миллиону раз, чтобы получить заметную разницу, вот код простого теста:
На моем PHP 5.5 это выводит:
сброс + ключ http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
источник
foreach
никогда не копирует массив, если вы непосредственно не модифицируете его внутри цикла foreach. На php5 структура массива может быть скопирована в некоторых случаях (когда ее refcount> 1), и вы действительно правы, это может оказать существенное влияние. К счастью, нет ничего страшного на php7, где эта проблема была решена. Вот отличная статья о том, как foreach работает сейчас под капотом, и как он работал в прошлом.key($an_array)
даст вам первый ключedit per Blixt: вы должны вызвать
reset($array);
прежде, чемkey($an_array)
сбросить указатель на начало массива.источник
Вы могли бы попробовать
источник
Для 2018+
Начиная с PHP 7.3, есть
array_key_first()
функция, которая достигает именно этого:Документация доступна здесь . 😉
источник
источник
Если эффективность не так важна для вас, вы можете использовать
array_keys($yourArray)[0]
в PHP 5.4 (и выше).Примеры:
Преимущество над решением:
является то, что вы можете передать
array_keys($arr)[0]
в качестве параметра функции (т.е.doSomething(array_keys($arr)[0], $otherParameter)
).НТН
источник
array_keys($arr)[0]
Действителен ли синтаксис?array dereferencing
. См. Например: schlueters.de/blog/archives/…Пожалуйста, найдите следующее:
Рабочий пример:
источник
источник
max()
доза не возвращает первый ключ массива ассоциаций. max возвращает максимальное значение списка или массива элементовЭто также может быть решением:
Я проверил это, и это работает.
Рабочий код .
источник
Чтобы улучшить решение Webmut , я добавил следующее решение:
Вывод для меня на PHP 7.1:
Если я сделаю это для массива размером 10000, то результаты станут
Время выполнения метода array_keys составляет 30 секунд (при использовании только 1000 элементов время для остальных операций было примерно таким же, но у метода array_keys было около 7,5 секунд).
источник
источник
Лучший способ, который работал для меня, был
array_keys
получает массив ключей из исходного массива, а затемarray_shift
вырезает из него значение первого элемента. Вам понадобится PHP 5.4+ для этого.источник
Это самый простой способ, который я когда-либо нашел. Быстро и всего две строчки кода :-D
источник
php73:
http://php.net/manual/en/function.array-key-first.php
источник
Однострочник:
источник
Сегодня мне пришлось искать первый ключ моего массива, возвращенный запросом POST. (И запишите номер для идентификатора формы и т. Д.)
Ну, я нашел это: вернуть первый ключ ассоциативного массива в PHP
http://php.net/key
Я сделал это, и это работает.
Может быть, это будет 15 минут от другого парня. КДМ.
источник
Вы можете играть со своим массивом
Чтобы получить первый элемент массива, который вы можете использовать,
current
и для последнего элемента вы можете использоватьend
редактировать
Просто для того, чтобы больше не получать отрицательных голосов за ответ, вы можете конвертировать ваш ключ в значение, используя
array_keys
и используя, как показано выше.источник