如何在数组中获得最后一个键?

如何获得数组的最后一个键?

481484 次浏览

一个解决方案是使用endkey (引用)的组合:

  • 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()来将指针带回数组的开头。

尝试使用最后一中的函数,如下所示:

<?php


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


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


?>

虽然end()似乎是最简单的,但它不是最快的。更快,更强的替代方法是array_slice():

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

测试表明,在一个有500000个元素的数组上,它几乎快了7倍!

我更喜欢

end(array_keys($myarr))

只需使用:echo $array[count($array) - 1];

不知道这是否会更快,但似乎更容易这样做,你避免错误不传递函数end()…

它只需要一个变量……多写一行代码,然后在需要时取消设置,这不是什么大问题。

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


$keys = array_keys($array);
$last = end($keys);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
$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(以说明数组键从0开始。

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


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


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

这将给你:

< p > int (1) 猫< / p >

你可以用这个:

$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);

我只是从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));

最好的解决方案,也可以使用内联:

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

这种解决方案只是表达式/语句,提供的性能很好,但不是最好的性能。

内联示例用法:

$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
< p > < br > 更新:在PHP 7.3+中:使用(当然)新添加的array_key_last()方法
由于PHP 7.3 (2018)有(最后)函数: http://php.net/manual/en/function.array-key-last.php < / p >
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

将输出

orange

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,以避免科学符号。在@TadejMagajna的回答下注释的初始基准测试归功于@MAChitgarha。

这意味着你可以检索最终键的值,而不需要:

  1. 移动数组指针(这需要两行代码)或
  2. 排序、反转、弹出、计数、索引键数组或任何其他愚蠢的操作

这个函数早就应该出现了,它是数组函数工具带中的一个受欢迎的新成员,可以提高性能,避免不必要的副作用,并实现干净/直接/直观的代码。

下面是一个演示:

$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())也会提供指针无知的访问书端元素,但他们显然未能获得足够的选票来实现。

以下是一些讨论新功能的相关页面:

附注:如果有人正在权衡其他一些技术,你可以参考这个小的比较集:(演示)

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_reverse()试试这个。

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

对于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()的组合,则必须重置数组使指针位于开头

很奇怪,但是这个话题为什么没有这个答案:

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

尝试保持与旧版本PHP的兼容性:

$array_keys    = array_keys( $array );
$last_item_key = array_pop( $array_keys );