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



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



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


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

535   19  

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) чтобы сбросить указатель на начало массива.

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)).

HTH

вы могли бы попробовать

array_keys($data)[0]
$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

http://php.net/key

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

    $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 и для последнего элемента вы можете использовать end

Edit

просто ради того, чтобы не получить больше голосов за ответ, вы можете конвертировать ваш ключ в значение с помощью array_keys и использовать, как показано выше.

Comments

    Ничего не найдено.