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


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.