Получить первый ключ в (возможно) ассоциативном массиве?
Каков наилучший способ определить первый ключ в возможно ассоциативном массиве? Сначала я подумал, что нужно просто просмотреть массив, а затем сразу же разбить его, вот так:
foreach ($an_array as $key => $val) break;
Таким образом, наличие ключа $ содержит первый ключ, но это кажется неэффективным. У кого-нибудь есть лучшее решение?
26 ответов
Ты можешь использовать 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
, Последний подход, вероятно, немного быстрее (хотя я его не тестировал), но имеет побочный эффект сброса внутреннего указателя.
Интересно, что цикл foreach на самом деле является наиболее эффективным способом сделать это.
Поскольку ОП конкретно спрашивает об эффективности, следует отметить, что все текущие ответы на самом деле гораздо менее эффективны, чем foreach.
Я сделал тест на это с php 5.4, и метод указателя сброса / ключа (принятый ответ), кажется, примерно в 7 раз медленнее, чем foreach. Другие подходы, манипулирующие всем массивом (array_keys, array_flip), очевидно, даже медленнее этого и становятся намного хуже при работе с большим массивом.
Foreach не является неэффективным, не стесняйтесь использовать его!
Изменить 2015-03-03:
Запрошены эталонные скрипты, у меня нет оригинальных, но вместо этого я сделал несколько новых тестов. На этот раз я нашел foreach только в два раза быстрее, чем кнопка сброса / нажатия. Я использовал массив из 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
foreach http://3v4l.org/gRoGD/perf
key($an_array)
даст вам первый ключ
редактировать за блик: вы должны позвонить reset($array);
до key($an_array)
сбросить указатель на начало массива.
Для 2018+
Начиная с PHP 7.3, есть array_key_first()
Функция, которая достигает именно этого:
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
echo array_key_first($array); // 'foo'
Документация доступна здесь.
Если эффективность не так важна для вас, вы можете использовать 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)
).
НТН
Пожалуйста, найдите следующее:
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys = array_keys($yourArray);
echo "Key = ".$keys[0];
Я думаю, что это будет работать.
$myArray = array(
2 => '3th element',
4 => 'first element',
1 => 'second element',
3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
Это также может быть решением.
$first_key = current(array_flip($array));
Я проверил это, и это работает.
Чтобы улучшить решение 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 секунд).
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
list($first_key) = each($arr);
print $first_key;
// key1
Это самый простой способ, который я когда-либо нашел. Быстро и всего две строки кода:-D
$keys = array_keys($array);
echo $array[$keys[0]];
Лучший способ, который работал для меня, был
array_shift(array_keys($array))
array_keys
получает массив ключей из исходного массива, а затем array_shift
вырезает из него значение первого элемента. Для этого вам понадобится PHP 5.4+.
Php 73:
$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'
array_key_last($array); // 'b';
В ответ на @Blixt, до версии 7.3.0 можно использовать этот полифилл:
if (!function_exists('array_key_first')) {
function array_key_first(array $array) {
return key(array_slice($array, 0, 1, true));
}
}
Начиная с версии PHP 7.3.0 array_key_first()
может быть использован.
Есть несколько способов предоставить эту функциональность для версий до PHP 7.3.0. Можно использовать
array_keys()
, но это может быть довольно неэффективно. Также можно использовать
reset()
и
key()
, но это может изменить указатель внутреннего массива. Эффективное решение, которое не меняет указатель внутреннего массива, записанный как polyfill:
<?php
if (!function_exists('array_key_first')) {
function array_key_first(array $arr) {
foreach($arr as $key => $unused) {
return $key;
}
return NULL;
}
}
?>
Это будет работать на всех версиях PHP
$firstKey = '' ;
//$contact7formlist - associative array.
if(function_exists('array_key_first')){
$firstKey = array_key_first($contact7formlist);
}else{
foreach ($contact7formlist as $key => $contact7form ){
$firstKey = $key;
break;
}
}
Однострочник:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'
Я думаю, что лучший и самый быстрый способ сделать это:
$first_key=key(array_slice($array, 0, 1, TRUE))
Сегодня мне пришлось искать первый ключ моего массива, возвращенный запросом POST. (И запомните номер для идентификатора формы и т. Д.)
Ну, я нашел это: вернуть первый ключ ассоциативного массива в PHP
Я сделал это, и это работает.
$data = $request->request->all();
dump($data);
while ($test = current($data)) {
dump($test);
echo key($data).'<br />';die();
break;
}
Может быть, это будет 15 минут от другого парня. КДМ.
array_chunk разбивает массив на куски, вы можете использовать:
$arr = ['uno'=>'one','due'=>'two','tre'=>'three'];
$firstElement = array_chunk($arr,1,true)[0];
var_dump($firstElement);
Более универсальная и безопасная версия с запасным вариантом для пустого итерируемого / массива:
Примечание. Предполагая, что массив $ является
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: Таким образом, вам не нужно перепроверять итерацию. (массив в этом случае).
Foreach - это самый быстрый способ перебора всего.
Рекомендации и объяснения: я рекомендую установить значения по умолчанию для $firstKey
а также $firstValue
перед итерацией, просто чтобы вы знали, был ли массив пуст или нет.
Примечание. Если вы полагаете, что ваш массив будет всегда заполнен, значения по умолчанию не нужны. (но будьте уверены на 100%!)
Объяснение для более продвинутых вещей:
Если ваш итерируемый имеет пользовательский Iterator
вам может потребоваться сбросить его вручную после оператора foreach.
Подробнее о PHP: итерируемые
Использование :
$array = ['po','co','so'];
echo reset($array);
Результат: po
Вы можете играть со своим массивом
$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
и для последнего элемента вы можете использовать end
редактировать
Просто для того, чтобы больше не получать отрицательных голосов за ответ, вы можете конвертировать ваш ключ в значение, используя array_keys
и используйте, как показано выше.