Получить первый ключ в (возможно) ассоциативном массиве?
каков наилучший способ определить первый ключ в возможном ассоциативном массиве? Моя первая мысль это просто foreach массив, а затем сразу же разбить его, как это:
foreach ($an_array as $key => $val) break;
таким образом, $key содержит первый ключ, но это кажется неэффективным. У кого-нибудь есть лучшее решение?
19 ответов:
можно использовать
resetиkey:reset($array); $first_key = key($array);это по существу то же самое, что и ваш исходный код, но с немного меньшими накладными расходами, и это более очевидно, что происходит.
только не забудьте позвонить
reset, или вы можете получить любой из ключей в массиве. Вы также можете использоватьendвместоresetчтобы получить Последний ключ.если вы хотели ключ, чтобы получить первое значение,
resetна самом деле возвращает его:$first_value = reset($array);есть один особый случай, чтобы следить за хотя (так что проверьте длину массива в первую очередь):
$arr1 = array(false); $arr2 = array(); var_dump(reset($arr1) === reset($arr2)); // bool(true)
array_keysвозвращает массив ключей. Возьмите первую запись. Кроме того, вы можете позвонитьresetна массиве, а затемkey. Последний подход, вероятно, немного быстрее (Thoug я его не тестировал), но он имеет побочный эффект сброса внутреннего указателя.
интересно, что цикл foreach на самом деле является наиболее эффективным способом сделать это.
Я сделал тест на этом с php 5.4, и метод reset/key pointer (принятый ответ), кажется, примерно в 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 to get first key and value: " . (microtime(true) - $start) . " seconds <br />"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { $firstValue = reset($array); $firstKey = key($array); } echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { reset($array); $firstKey = key($array); } echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { $firstKey = array_keys($array)[0]; } echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";на моем php 5.5 это выводит:
foreach to get first key and value: 0.15501809120178 seconds reset+key to get first key and value: 0.29375791549683 seconds reset+key to get first key: 0.26421809196472 seconds array_keys to get first key: 10.059751987457 secondsсброс + ключ http://3v4l.org/b4DrN/perf#tabs
по каждому элементу http://3v4l.org/gRoGD/perf#tabs
key($an_array)даст вам первый ключредактировать в Blixt: вы должны позвонить
reset($array);доkey($an_array)чтобы сбросить указатель на начало массива.
если эффективность не так важна для вас, вы можете использовать
array_keys($yourArray)[0]в PHP 5.4 (и выше).примеры:
# 1 $arr = ["my" => "test", "is" => "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "my" # 2 $arr = ["test", "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "0" # 3 $arr = [1 => "test", 2 => "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "1"преимущество над решением:
list($firstKey) = array_keys($yourArray);это то, что вы можете пройти
array_keys($arr)[0]как параметр функции (т. е.doSomething(array_keys($arr)[0], $otherParameter)).HTH
$myArray = array( 2 => '3th element', 4 => 'first element', 1 => 'second element', 3 => '4th element' ); echo min(array_keys($myArray)); // return 1
пожалуйста, найти следующее:
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5); $keys = array_keys($yourArray); echo "Key = ".$keys[0];Я думаю, что это будет работать.
Это также может быть решением.
$first_key = current(array_flip($array));я испытывал его и он работает.
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); list($first_key) = each($arr); print $first_key; // key1
для повышения на решение Webmut, я добавил следующее решение:
$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];вывод для меня на PHP 7.1:
foreach to get first key and value: 0.048566102981567 seconds reset+key to get first key and value: 0.11727809906006 seconds reset+key to get first key: 0.11707186698914 seconds array_keys to get first key: 0.53917098045349 seconds array_slice to get first key: 0.2494580745697 secondsЕсли я делаю это для массива размером 10000, то результаты становятся
foreach to get first key and value: 0.048488140106201 seconds reset+key to get first key and value: 0.12659382820129 seconds reset+key to get first key: 0.12248802185059 seconds array_slice to get first key: 0.25442600250244 secondsвремя ожидания метода array_keys составляет 30 секунд (только с 1000 элементами время для остальных было примерно одинаковым, но метод array_keys имел около 7,5 секунд).
на 2018 год+
Начиная с PHP 7.3, естьarray_key_first()функция, которая достигает именно этого:$array = ['foo' => 'lorem', 'bar' => 'ipsum']; $firstKey = array_key_first($array); echo $firstKey; // 'foo'документация здесь.
лучший способ, который работал для меня был
array_shift(array_keys($array))
array_keysвозвращает массив ключей из исходного массива, а затемarray_shiftвырезает из него первый элемент. Для этого вам понадобится PHP 5.4+.
Это самый простой способ, который я когда-либо находил. Быстрый и только две строки кода : - D
$keys = array_keys($array); echo $array[$keys[0]];
один-лайнер:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); echo key( array_slice( $array, 0, 1, true ) ); # echos 'key1'
сегодня мне пришлось искать первый ключ моего массива, возвращенный запросом POST. (И обратите внимание на номер для идентификатора формы и т. д.)
Ну, я нашел это: возвращает первый ключ ассоциативного массива в PHP
Я сделал это, и это работает.
$data = $request->request->all(); dump($data); while ($test = current($data)) { dump($test); echo key($data).'<br />';die(); break; }может быть, это будет эко 15 минут другого парня. СИА.
более универсальная и безопасная версия с резервным вариантом для пустого iterable / array:
Примечание: предполагая, что $массиве
arrayилиiterable(PHP >=7.1)$array = [/* ... */]; // my array or iterable // these lines are a fallback for the case nothing is found $firstKey = null; // null or default value of your choice $firstValue = null; // null or default value of your choice // iterating the array foreach ($array as $firstKey => $firstValue) { // stop after first iteration break; }TLDR: таким образом, вам не нужно дважды проверять iterable. (массив в данном случае).
Foreach-это самый быстрый способ перебора всего.
рекомендации и объяснения: Я рекомендую установить значения по умолчанию для
$firstKeyи$firstValueперед итерация, просто чтобы вы знали, был ли массив пустым или нет.Примечание: Если вы полагаетесь, что Ваш массив всегда будет заполнен, нет необходимости в значениях по умолчанию. (но будьте 100% уверены в этом!)
объяснение для более продвинутых вещей:
если ваш iterable имеет пользовательский
Iteratorвы, возможно, потребуется, чтобы сбросить его вручную после того, как оператор foreach.подробнее о PHP: iterables
вы можете играть с вашим массивом
$daysArray = array('Monday', 'Tuesday', 'Sunday'); $day = current($transport); // $day = 'Monday'; $day = next($transport); // $day = 'Tuesday'; $day = current($transport); // $day = 'Tuesday'; $day = prev($transport); // $day = 'Monday'; $day = end($transport); // $day = 'Sunday'; $day = current($transport); // $day = 'Sunday';чтобы получить первый элемент массива можно использовать
currentи для последнего элемента вы можете использоватьendEdit
просто ради того, чтобы не получить больше голосов за ответ, вы можете конвертировать ваш ключ в значение с помощью
array_keysи использовать, как показано выше.
Comments