<?php
// PHP >= 7
function _array_key_last(array $array){
return (!empty($array)) ? array_keys($array)[count($array)-1] : null;
}
var_dump(_array_key_last(['PHP', 'Javascript', 'Python'])); // 2
?>
(PHP 7 >= 7.3.0)
array_key_last — Получает последний ключ массива
Получить последний ключ заданного массива array
, не затрагивая
внутренний указатель массива.
array
Массив.
Возвращает последний ключ массива array
, если он не пустой;
NULL
в противном случае.
<?php
// PHP >= 7
function _array_key_last(array $array){
return (!empty($array)) ? array_keys($array)[count($array)-1] : null;
}
var_dump(_array_key_last(['PHP', 'Javascript', 'Python'])); // 2
?>
For PHP <= 7.3.0 :
if (! function_exists("array_key_last")) {
function array_key_last($array) {
if (!is_array($array) || empty($array)) {
return NULL;
}
return array_keys($array)[count($array)-1];
}
}
For PHP < 7.3.0 :
Will work for any type of array
<?php
if ( ! function_exists( 'array_key_last' ) ) {
/**
* Polyfill for array_key_last() function added in PHP 7.3.
*
* Get the last key of the given array without affecting
* the internal array pointer.
*
* @param array $array An array
*
* @return mixed The last key of array if the array is not empty; NULL otherwise.
*/
function array_key_last( $array ) {
$key = NULL;
if ( is_array( $array ) ) {
end( $array );
$key = key( $array );
}
return $key;
}
}
?>
This polyfill works for PHP 5.6+.
It is a slight modification of "wes at nospam dot example dot org"'s example:
<?php
if( !function_exists('array_key_first') ) {
function array_key_first(array $array) {
if( $array === [] ) { return NULL; }
foreach($array as $key => $_) { return $key; }
}
}
if( !function_exists('array_key_last') ) {
function array_key_last(array $array) {
if( $array === [] ) { return null; }
// the last 2 args to array_slice are crucial
return array_key_first(array_slice($array, -1, null, true));
}
}
Try to beat this polyfill in terms of performance!
<?php
if( !function_exists('array_key_last') ) {
function array_key_last(array $array) {
if( !empty($array) ) return key(array_slice($array, -1, 1, true));
}
}
// Bonus
if (!function_exists('array_key_first')) {
function array_key_first(array $arr) {
foreach($arr as $key => $unused) return $key;
}
}
?>
For those who loves tested candies;
<?php
function array_key_last(array $array) {
// 100000 iters: ~0.068 secs
return key(array_slice($array, -1));
// 100000 iters: ~0.070 secs
return key(array_reverse($array));
// 100000 iters: ~0.088 secs
return array_keys($array)[count($array) - 1] ?? null;
}
?>
Correct polyfill (one that doesn't make copies of arrays, and that doesn't make use of the IAP) is:
<?php
if(!function_exists('array_key_first')){
function array_key_first(array $array){
if($array === []){
return NULL;
}
foreach($array as $key => $_) return $key;
}
}
if(!function_exists('array_key_last')){
function array_key_last(array $array){
if($array === []){
return NULL;
}
return array_key_first(array_slice($array, -1));
}
}
?>