Каков наилучший способ определить первый ключ в возможно ассоциативном массиве? Сначала я подумал, что нужно просто выделить массив, а затем сразу же разбить его следующим образом:
foreach ($an_array as $key => $val) break;
Таким образом, наличие ключа $ содержит первый ключ, но это кажется неэффективным. У кого-то есть лучшее решение?
Вы можете использовать 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, и метод указателя сброса / ключа (принятый ответ), кажется, примерно в 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
foreach http://3v4l.org/gRoGD/perf#tabs
key($an_array)
даст вам первый ключ
edit per Blixt: вы должны вызвать reset($array);
перед key($an_array)
чтобы сбросить указатель на начало массива.
list($firstKey) = array_keys($yourArray);
Если эффективность для вас не так важна, вы можете использовать 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)
).
НТН
$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));
Я тестировал его, и он работает.
Вы можете попробовать
array_keys($data)[0]
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); list($first_key) = each($arr); print $first_key; // key1
Лучший способ, который работал для меня, – это
array_shift(array_keys($array))
array_keys
получает массив ключей из начального массива, а затем array_shift
вырезает из него значение первого элемента. Для этого вам понадобится PHP 5.4+.
Вы можете играть с вашим массивом
$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 = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); echo key( array_slice( $array, 0, 1, true ) ); # echos 'key1'
Вы можете попробовать это. Чтобы получить первое значение массива: –
<?php $large_array = array('foo' => 'bar', 'hello' => 'world'); var_dump(current($large_array)); ?>
Чтобы получить первый ключ массива
<?php $large_array = array('foo' => 'bar', 'hello' => 'world'); $large_array_keys = array_keys($large_array); var_dump(array_shift($large_array_keys)); ?>
Это самый простой способ, который я когда-либо находил. Быстрая и только две строки кода: -D
$keys = array_keys($array); echo $array[$keys[0]];
Чтобы улучшить решение 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 секунд).
Сегодня мне пришлось искать первый ключ моего массива, возвращенный запросом POST. (И обратите внимание на номер для идентификатора формы и т. Д.)
Ну, я нашел это: Вернуть первый ключ ассоциативного массива в PHP
Я сделал это, и он работает.
$data = $request->request->all(); dump($data); while ($test = current($data)) { dump($test); echo key($data).'<br />';die(); break; }
Может быть, это будет 15 минут другого парня. КДМ.