Как я могу получить последний ключ массива?
Как я могу получить последний ключ массива?
Ответы:
Решение было бы использовать комбинацию 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()
массив, чтобы вернуть указатель на начало массива.
reset()
) ;; но вы правы в указании этой функции, которая может быть полезной.
array('a', 'b', 'c', 'd', 'a')
что он вернет ключ 0, а не 4.
Хотя, end()
кажется, самый простой, это не самый быстрый. Более быстрая и гораздо более сильная альтернатива array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Как говорят тесты , для массива с 500000 элементов это почти в 7 раз быстрее!
end($arr);$key = key($arr);reset($arr);
с (б) $key = key(array_slice($arr,-1,1,true));
... что привело end()
к НАМНОГО быстрее! end () = 0,05326 секунд, array_slice = 8,506 секунд ... да ??
end()
самый быстрый, потому что он может быть получен из очень простой C-функции, такой как:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
на последний элемент. Делая в end()
значительной степени O (1). :-)
я предпочитаю
end(array_keys($myarr))
end((array_keys($myarr)))
чтобы обойти уведомление.
Начиная с 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
Просто используйте: echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
который интересно, но не очень хорошо для бизнеса, когда у вас ограниченный бюджет времени
$a[1] = 1; $a[5] = 5; $a[0] = 0;
вас будет массив с ключами (1, 5, 0) в указанном порядке. count($a)
даст 3 и $a[2]
не определено. Это, конечно, не дает вам 5 обратно.
Не знаю, будет ли это быстрее или нет, но кажется, что так проще сделать, и вы избежите ошибки, не передав функцию в end () ...
просто нужна переменная ... ничего страшного, чтобы написать еще одну строку кода, а затем сбросить ее, если нужно.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
По состоянию на 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 .
Это означает, что вы можете получить значение окончательного ключа без:
Эта функция давно просрочена и является долгожданным дополнением к инструментальному поясу с функцией массива, который повышает производительность, позволяет избежать нежелательных побочных эффектов и обеспечивает чистый / прямой / интуитивно понятный код.
Вот демо :
$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()
) также предложили бы невежественный указатель доступа к элементам bookend, но они, очевидно, не смогли набрать достаточное количество голосов, чтобы воплотиться в жизнь.Вот несколько соответствующих страниц, обсуждающих новые функции:
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
Попробуйте использовать функции array_pop и array_keys следующим образом:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
оперирует возвращаемым значением, array_keys()
а не исходным массивом.
Начиная с 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()
Я также хотел бы предложить альтернативное решение этой проблемы.
Предполагая, что все ваши ключи являются числовыми без пробелов, я предпочитаю подсчитать массив, затем минус 1 от этого значения (чтобы учесть тот факт, что ключи массива начинаются с 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Это даст вам:
int (1) cat
Вы можете использовать это:
$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);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
Попробуйте это с array_reverse()
.
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Это работает, потому что PHP перемещает свой указатель массива внутри для $ array
Лучшее возможное решение, которое также может быть использовано при использовании inline:
end($arr) && false ?: key($arr)
Это решение является только выражением / заявлением и обеспечивает хорошее, а не наилучшее из возможных результатов.
Пример использования встроенного примера:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
ОБНОВЛЕНИЕ: В PHP 7.3+: используйте (конечно) недавно добавленный array_key_last()
метод.