Получить первый ключ в (возможно) ассоциативном массиве?

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

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

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

Ответы

Ответ 1

Вы можете использовать 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)

Ответ 2

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

Ответ 3

Интересно, что цикл foreach на самом деле является наиболее эффективным способом этого.

Поскольку OP специально задал вопрос об эффективности, следует отметить, что все текущие ответы на самом деле намного менее эффективны, чем foreach.

Я сделал тест на php 5.4, а метод указателя reset/key (принятый ответ) примерно в 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

reset + ключ http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

Ответ 4

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

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

Ответ 5

list($firstKey) = array_keys($yourArray);

Ответ 6

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

НТН

Ответ 7

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

array_keys($data)[0]

Ответ 8

$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

Ответ 9

Найдите следующее:

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

Я думаю, что это сработает.

Ответ 10

Это также может быть решением.

$first_key = current(array_flip($array));

Я тестировал его, и он работает.

Ответ 11

Для 2018+

Начиная с PHP 7.3, существует array_key_first() которая достигает именно этого:

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

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

Ответ 12

 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1

Ответ 13

Чтобы улучшить решение 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 секунд).

Ответ 14

Лучший способ, который работал у меня, -

array_shift(array_keys($array))

array_keys получает массив ключей из начального массива, а затем array_shift вырезает из него значение первого элемента. Для этого вам понадобится PHP 5.4+.

Ответ 15

Это самый простой способ, который я когда-либо нашел. Быстрая и только две строки кода: -D

$keys = array_keys($array);
echo $array[$keys[0]];

Ответ 16

Однострочный:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'

Ответ 17

Вы можете попробовать это. Чтобы получить первое значение массива: -

<?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));
?>

Ответ 18

Сегодня мне пришлось искать первый ключ моего массива, возвращенный запросом POST. (И обратите внимание на номер для идентификатора формы и т.д.)

Ну, я нашел это: Вернуть первый ключ ассоциативного массива в PHP

http://php.net/key

Я сделал это, и он работает.

    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

Может быть, это будет 15 минут другого парня. КДМ.

Ответ 20

Вы можете играть с вашим массивом

$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 и использовать, как показано выше.