Як отримати останній ключ у масиві?


335

Як я можу отримати останній ключ масиву?


10
Потрібно вказати асоціативний масив, числовий масив або якщо він повинен працювати на обох.
Jimbo Jonny

часто
задаване

Відповіді:


610

Рішенням буде використання комбінації endта (цитування) :key

  • end() переміщує внутрішній покажчик масиву на останній елемент і повертає його значення.
  • key() повертає індексний елемент поточної позиції масиву.

Отже, така частина коду, як ця, повинна зробити трюк:

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

Виведе:

string 'last' (length=4)

тобто ключ останнього елемента мого масиву.

Після цього внутрішній покажчик масиву буде в кінці масиву. Як зазначено в коментарях, ви можете запустити reset()масив, щоб повернути вказівник на початок масиву.


17
@Pim: залежить від того, що ОП хоче зробити з цим масивом після (можливо, не потрібно буде дзвонити reset()) ;; але ви праві, вказуючи на цю функцію, яка може бути корисною.
Паскаль МАРТИН

3
@PascalMARTIN +1 Я думаю, що додавання коментаря про скидання () у вашій відповіді буде дуже корисним.
Лулу

Цей підхід не працює, якщо масив має повторювані значення. напр. для array('a', 'b', 'c', 'd', 'a')нього буде повертати ключ 0 , а не 4.
Marc

2
@Marc такий підхід працює правильно, навіть якщо є дублююче значення.
Джефф

1
@pppp це не працює, тому що ... перевіри, який кінець () повертається, а потім подумай ще раз;)
forsberg

79

Хоча end()здається, що це найпростіше, але це не найшвидше. Швидша і набагато сильніша альтернатива array_slice():

$lastKey = key(array_slice($array, -1, 1, true));

Як свідчать тести , на масиві з 500000 елементами це майже в 7 разів швидше!


98
схвильований цією відповіддю, я зробив швидкий тест на 100 000 ітерацій, порівнюючи (а) end($arr);$key = key($arr);reset($arr);проти (б) $key = key(array_slice($arr,-1,1,true));... в результаті чого end()МНОГО швидше! end () = 0,05326 секунд, array_slice = 8,506 секунди ... так ??
neokio

54
Вбудовані функції PHP були побудовані крайніми оленями. Не намагайтеся відтворити ці функції. Шанси в тому, що ви робите щось набагато повільніше, ніж оригінал. Якщо ви не якийсь злий чарівник, з хитрості.
dmmd

16
end()найшвидший, тому що його можна отримати з дуже простої C-функції, наприклад:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Густав

10
@Gustav Я вважаю, що в основі C-реалізації PHP лежить внутрішня вказівка lastна останній елемент. Створення end()майже О (1). :-)
Ерік

15
@dmmd, я впевнений, що команда PHP була б надзвичайно рада, що їх називають оленями.
datasn.io

53

я віддаю перевагу

end(array_keys($myarr))

19
викликає СТРУКТУВАННЯ, кінець очікує змінну посилання
Wiliam

25
Ви можете використовувати, end((array_keys($myarr)))щоб обійти повідомлення.
Бен Фортун

9
@BenFortune Це було зафіксовано в PHP7: "У PHP 5 використання надмірних дужок навколо параметра функції може заспокоїти суворі попередження стандартів, коли параметр функції передається посиланням. Тепер попередження завжди буде видаватися."
Домінік Шерлінк

це абсолютно непотрібне попередження! це такий звичайний і звичайний матеріал на всіх інших мовах!
azerafati

1
В інших мовах функції не працюють на покажчиках, чи не так?
jurchiks

52

Оскільки PHP 7.3 (2018) для цього існує (нарешті) функція: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

виведе

orange

4
Хоррей! Я збирався додати цю відповідь. Не могли б ви виділити версію "PHP 7.3" та 2018 рік? Буде легше помітити цю дивовижну новину для інших
Томаш Вотруба

Також добре зазначити, що це НЕ впливає на внутрішній покажчик масиву.
mvorisek

30

Просто використовуйте: echo $array[count($array) - 1];


75
Це працює лише за наявності числових масивів. Помилка з асоційованими масивами.
Джеремі Дж Старчер

12
Це не тільки працює тільки на числових масивах, вона не показує ключ, але показує значення, чи не так?
Нанна

я теж Джейк, чи можемо ми зробити щось, де ми розділимо це (нехай буде чесним) топ-хіт Google у чисельний та асоціативний характер, щоб у нас було старе посилання для обох ... Я лише розробив, що це було для Assoc після розбору, int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }який є цікаво, але не годиться для бізнесу, коли ви перебуваєте на часовому бюджеті
lol

5
Крім того, навіть для числового масиву майте на увазі, що числові масиви не повинні йти в порядку або використовувати всі числа. Це спрацює, якщо ви явно не призначите числові значення, але якщо ви це зробите, $a[1] = 1; $a[5] = 5; $a[0] = 0;то у вас буде масив з ключами (1, 5, 0) у такому порядку. count($a)дасть 3 і $a[2]не визначено. Це, звичайно, не дає вам 5 назад.
Даніель Скарбек

1
Прочитайте ще раз питання "Як отримати останній ключ у масиві?"

20

Не знаєте, чи буде це швидше чи ні, але здається, що це зробити простіше так, і ви уникнете помилки, не переходячи у функції до кінця () ...

просто потрібна була змінна ... не велика справа, щоб написати ще один рядок коду, а потім зняти його, якщо потрібно.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

2
Ця відповідь (хоча технічно правильна) є марною / неефективною, оскільки вимагає створення додаткового масиву (однакової довжини, як оригінал). Це означає, що відходи збільшуються, як і оригінальний масив. Це ніколи не слід обирати через ефективну відповідь Паскаля МАРТІНА. Я здивований, що це так багато відгуків.
mickmackusa

12

Станом на PHP7.3 ви можете безпосередньо отримати доступ до останнього ключа в (зовнішній рівень) масиву з array_key_last ()

Очевидно, велика частина дебатів на цій сторінці лягає спати. Це найкращий виконавець, який не має жодних побічних ефектів, і є прямим, інтуїтивним методом одноразового виклику, щоб забезпечити саме те, що прагне це питання.

Приблизний орієнтир як доказ: https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* тестовий масив містить 500000 елементів, мікрочасові повторювані 100x, а потім усереднені та помножені на 1000, щоб уникнути наукових позначень. Заслуга @MAChitgarha за початковий показник, прокоментований під відповіддю @ TadejMagajna .

Це означає, що ви можете отримати значення підсумкового ключа без:

  1. переміщення покажчика масиву (для якого потрібні два рядки коду) або
  2. сортування, реверсування, вискакування, підрахунок, індексація масиву ключів або будь-який інший tomfoolery

Ця функція давно назріла, і ласкаво просимо доповнення до поясу інструментів функції масиву, що покращує продуктивність, уникає небажаних побічних ефектів, а також забезпечує чистий / прямий / інтуїтивний код.

Ось демонстрація :

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

Вихід:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

Деякі примітки:

  • array_key_last()- це функція зведення братів array_key_first () .
  • Обидві ці функції є "покажчиком-невігласом".
  • Обидві функції повертаються, nullякщо масив порожній.
  • Відкинуті функції братів array_value_first()та сестер ( & array_value_last()) також запропонували б невігласовому доступу до елементів завантаження, але вони, очевидно, не змогли зібрати достатню кількість голосів, щоб ожити.

Ось кілька релевантних сторінок, які обговорюють нові функції:

ps Якщо хтось зважує деякі інші методи, ви можете звернутися до цієї невеликої колекції порівнянь: ( Демо )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408

2
Ця відповідь має бути вгорі списку. Це просто повно.
Джон

1
Нічого собі, DV на цю відповідь моєї? У чому справа, надто всеосяжна / остаточна / пояснювальна / підтримується? Pfft. Безумовно, продовжуйте відштовхувати пости, про які наважуєтесь повідомити. Хороша робота. Якщо ви не знаєте, кнопка DV призначена для публікацій, які "не корисні". Запитайте, будь ласка, яка ваша мета тут.
mickmackusa

8

Спробуйте використовувати функції array_pop та array_keys наступним чином:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

14
Це дуже повільно, якщо у вашому масиві є більше ніж одна річ. Будь ласка, не робіть цього.
Андрій

3
і спричиняє СТРАХОВЕ ПОВІДОМЛЕННЯ, змінна посилання
Wiliam

array_pop () скоротить початковий масив (видаливши останній елемент). Я не впевнений, важливо це для ОП, чи ні, але, безумовно, це матиме значення для інших.
Programster

1
Не зовсім. У цьому прикладі array_pop()працює на повернене значення, array_keys()а не на початковий масив.
Петко Босаков

Оскільки існують й інші ефективніші відповіді, які не викликають ВИМОГА, я спростовую цю відповідь.
mickmackusa

6

Станом на PHP> = 7.3 array_key_last()це найкращий спосіб отримати останній ключ будь-якого масиву. Використовуючи комбінацію end(), key()і reset()просто отримати останній ключ масиву обурливо.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

порівняйте це з

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

Ви повинні скинути масив, щоб покажчик був на початку, якщо ви використовуєте комбінацію end()таkey()


4

Я також хотів би запропонувати альтернативне рішення цієї проблеми.

Якщо припустити, що всі ваші ключі є числовими без пропусків, моїм кращим методом є підрахунок масиву, а потім мінус 1 від цього значення (для врахування факту, що ключі масиву починаються з 0.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

Це дасть вам:

int (1) кіт


1
Це не буде працювати для масиву, де ключі не збільшуються, наприклад, масив (0 => 'собака', 5 => 'кішка'); $ lastKey поверне неправильне значення
kakoma

@kakoma - Як говориться в моєму дописі, "якщо припустити, що всі ваші ключі є цифровими без пропусків".

Для всіх, хто дивується, використовуйте PHP "array_values", щоб перетворити масив на числовий послідовний. php.net/manual/en/function.array-values.php

1
Оскільки ця відповідь стосується лише частини можливостей масиву (числових, послідовно заповнених масивів), ця відповідь не пропонує надійної / правильної відповіді на узагальнене питання ОП. Downvote.
mickmackusa

4

Ви можете скористатися цим:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

Іншим рішенням є створення функції та використання її:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);

1
Ця відповідь не забезпечує нічого нового, що б не було в цій темі.
Мартін

1
Мартіне, ніхто не використовує функцію для отримання результату.
Atif Tariq

1
чи потрібно додати 1 рядок коду до функції? Це досить непотрібний інтерфейс.
Мартін

1
Мартін, який один рядок.
Atif Tariq

2
рядок у вашій функції
Мартін

3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3

2
Зворот всього масиву лише для витягування одного значення, безумовно, менш ефективний, ніж метод PascalMARTIN. Хоча це технічно правильно, його ніколи не слід використовувати замість підходу Паскаля.
mickmackusa

3

Я просто взяв функцію помічника від Xander і вдосконалив її за допомогою відповідей раніше:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));

1

Спробуйте це array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

1

Дивно, але чому ця тема не має такої відповіді:

$lastKey = array_keys($array)[count($array)-1];


0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

Це працює, тому що PHP переміщує вказівник масиву внутрішньо для $ масиву


2
Це дублікат методу PascalMARTIN. Будь ласка, запасіть цю сторінку та видаліть пізню / дублюючу відповідь. Захищений.
mickmackusa

0

Найкраще можливе рішення, яке також може бути використане inline:

end($arr) && false ?: key($arr)

Це рішення є лише виразом / твердженням і забезпечує гарне не найкраще можливе виконання.

Використання накресленого прикладу:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


ОНОВЛЕННЯ: У PHP 7.3+: використовувати (звичайно) щойно доданий array_key_last()метод.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.