Получить первый ключ в (возможно) ассоциативном массиве? - PullRequest
710 голосов
/ 22 июня 2009

Как лучше всего определить первый ключ в возможно ассоциативном массиве? Сначала я подумал, что нужно просто просмотреть массив, а затем сразу же разбить его, как это:

foreach ($an_array as $key => $val) break;

Таким образом, наличие ключа $ содержит первый ключ, но это кажется неэффективным. У кого-нибудь есть лучшее решение?

Ответы [ 19 ]

1259 голосов
/ 22 июня 2009

2019 Обновление

Начиная с PHP 7.3 , есть новая встроенная функция под названием array_key_first(), которая будет извлекать первый ключ из данного массива без сброса внутреннего указателя. Проверьте документацию для получения дополнительной информации.


Вы можете использовать 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)
75 голосов
/ 22 июня 2009

array_keys возвращает массив ключей. Возьми первую запись. В качестве альтернативы вы можете вызвать reset для массива, а затем key. Последний подход, вероятно, немного быстрее (хотя я его не тестировал), но имеет побочный эффект сброса внутреннего указателя.

51 голосов
/ 19 января 2014

Интересно, что цикл 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#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

36 голосов
/ 22 июня 2009

key($an_array) даст вам первый ключ

редактировать для каждого Blixt: вы должны вызвать reset($array); до key($an_array), чтобы сбросить указатель на начало массива.

22 голосов
/ 06 ноября 2014

Вы можете попробовать

array_keys($data)[0]
21 голосов
/ 12 апреля 2012
list($firstKey) = array_keys($yourArray);
20 голосов
/ 26 апреля 2013

Если эффективность не так важна для вас, вы можете использовать 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)).

НТН

19 голосов
/ 29 августа 2018

Для 2018 года +

Начиная с PHP 7.3, есть функция array_key_first(), которая обеспечивает именно это:

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

Документация доступна здесь . ?

12 голосов
/ 28 апреля 2012
$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
11 голосов
/ 02 декабря 2011

Пожалуйста, найдите следующее:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];

Рабочий пример:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...