Как получить последний ключ в массиве?

251

Как я могу получить последний ключ массива?

  • 9
    Следует указать ассоциативный массив, числовой массив или, если должен работать на обоих.
  • 0
    часто задаваемый вопрос
Теги:
arrays

13 ответов

460
Лучший ответ

Решение заключалось бы в использовании комбинации 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)

то есть. ключ последнего элемента моего массива.

  • 108
    Вы должны сбросить () указатель массива, чтобы быть безопасным.
  • 15
    @Pim: зависит от того, что OP хочет делать с этим массивом после (может не понадобиться для вызова reset() ) ;; но вы правы в указании этой функции, которая может быть полезной.
Показать ещё 12 комментариев
62

Хотя end() кажется самым простым , он не самый быстрый.

Чем быстрее, тем сильнее альтернатива array_slice()

Вычеркнуть редактор: эта претензия не была обоснована и в комментариях упоминалось противоположное доказательство. Если есть об истине к этим утверждениям плаката о скорости/эффективности, а затем контрольный тест должен быть предоставлен.

$last_key = key( array_slice( $array, -1, 1, TRUE ) );
  • 94
    взволнованный этим ответом, я провел быструю проверку 100 000 итераций, сравнивая (a) end($arr);$key = key($arr);reset($arr); против (б) $key = key(array_slice($arr,-1,1,true)); ... что приводит к тому, что end() НАМНОГО быстрее! end () = 0,05326 секунд, array_slice = 8,506 секунд ... да ??
  • 50
    Встроенные функции PHP были созданы экстремальными ботаниками. Не пытайтесь воссоздать эти функции. Скорее всего, вы делаете что-то намного медленнее, чем оригинал. Если вы не какой-то злой волшебник, конечно.
Показать ещё 6 комментариев
39

Я предпочитаю

end(array_keys($myarr))
  • 16
    вызывает STRICT NOTICE, end ожидает ссылку на переменную
  • 22
    Вы можете использовать end((array_keys($myarr))) чтобы обойти уведомление.
Показать ещё 7 комментариев
26

Просто используйте: echo $array[count($array) - 1];

  • 72
    Это работает только если у вас есть числовые массивы. Сбой с ассоциированными массивами.
  • 4
    Что я искал и ОП не уточнил. Благодарю.
Показать ещё 6 комментариев
17

Не знаю, будет ли это быстрее или нет, но проще это сделать, и вы избегаете ошибки, не передавая функцию end()...

ему просто нужна была переменная... не нужно писать еще одну строку кода, а затем отменить ее, если вам нужно.

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

$keys = array_keys($array);
$last = end($keys);
  • 0
    Это возвращает значение, а не ключ.
  • 1
    Последний комментарий неверен. Он помещает все ключи в массив, а затем захватывает последний элемент этого массива, который оказывается последним ключом исходного массива.
Показать ещё 2 комментария
7

Попробуйте использовать array_pop и array_keys следующим образом:

<?php

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

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

?>
  • 13
    Это очень медленно, если в вашем массиве более 1 объекта. Пожалуйста, не делай этого.
  • 2
    и вызывает STRICT NOTICE тоже, ссылка на переменную
Показать ещё 3 комментария
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));
3

Вы можете использовать это:

$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);
  • 0
    Этот ответ не дает ничего нового, чего еще нет в этой теме.
  • 0
    Мартин, никто не использует функцию, чтобы получить результат.
Показать ещё 4 комментария
3

Я также хотел бы предложить альтернативное решение этой проблемы.

Предполагая, что все ваши ключи являются числовыми без каких-либо пробелов, мой предпочтительный метод состоит в том, чтобы подсчитать массив, а затем минус 1 из этого значения (чтобы учесть тот факт, что ключи массива начинаются с 0.

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

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

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

Это даст вам:

Int (1) кот

  • 0
    Это не будет работать для массивов, где ключи не являются инкрементальными, например, массив (0 => 'собака', 5 => 'кошка'); $ lastKey вернет неправильное значение
  • 0
    @kakoma - Как написано в моем сообщении: «Предполагается, что все ваши ключи числовые без пробелов».
Показать ещё 3 комментария
2
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
  • 1
    Обращение всего массива только для получения одного значения, безусловно, менее эффективно, чем метод PascalMARTIN. Хотя это технически правильно, его никогда не следует использовать вместо подхода Паскаля.
-2

Вот так:

$keys = array_keys($array);
$lastKey = $keys[sizeof($array)-1];
-3
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

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

Это работает, потому что PHP перемещает его указатель на массив внутри $array

  • 1
    Это дубликат метода PascalMARTIN. Пожалуйста, сохраните эту страницу и удалите ваш поздний / дублированный ответ. Downvoted.
-4

Это должно быть что-то вроде этого...

$latest_kid = end(array_reverse(array_keys($my_array)));

Измените массив, когда мы вызываем array_keys.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню