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

ajs*_*sie 321 php arrays

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

Pas*_*TIN 599

解决方案是使用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);
Run Code Online (Sandbox Code Playgroud)

将输出:

string 'last' (length=4)
Run Code Online (Sandbox Code Playgroud)

即我的数组的最后一个元素的键.

完成此操作后,数组的内部指针将位于数组的末尾.正如评论中指出的那样,您可能希望reset()在数组上运行以将指针返回到数组的开头.

  • 你应该重置()数组指针是安全的. (115认同)
  • @Pim:取决于OP在*之后想要对该数组做什么(可能不需要调用`reset()`)*;; 但你指出这个功能是对的,这可能很有用. (16认同)
  • @PascalMARTIN +1我想在你的答案中添加关于reset()的评论会非常有帮助. (3认同)
  • @Marc即使存在重复值,此方法也能正常工作. (2认同)

Tad*_*jna 72

虽然end()看起来最简单,但并不是最快的.

更快,更强大的选择是 array_slice()

编辑罢工:这一说法没有得到证实,评论中提到了相反的证据.如果这张海报关于速度/效率的断言有任何真相,那么必须提供基准测试.

$lastKey = key(array_slice($array, -1, 1, true));
Run Code Online (Sandbox Code Playgroud)

  • 对这个答案很兴奋,我做了100,000次迭代的快速测试,比较(a)`end($ arr); $ key = key($ arr); reset($ arr);`反对(b)`$ key = key (array_slice($ arr,-1,1,true));`...这导致`end()`更快!end()= 0.05326秒,array_slice = 8.506秒......呵呵? (96认同)
  • PHP的内置函数是由极端的书呆子构建的.不要尝试重新创建这些功能.可能性是你做的东西比原来慢得多.除非你是某种邪恶的巫师. (52认同)
  • `end()`是最快的,因为它可以从一个非常简单的C函数派生,例如:`int top(void){int i; for(i = 0; stack [i]!='\ 0'; i ++); 返回堆栈[ - i]; }` (15认同)
  • @dmmd,我确信PHP团队会非常高兴他们被称为书呆子. (12认同)
  • @Gustav我相信PHP的底层C实现,实际上有一个内部指针`last`到最后一个元素.使`end()`几乎为O(1).:-) (9认同)
  • 太棒了。我想要最后一个和倒数第二个元素。接受的答案只回答最后 (2认同)
  • @MAChitgarha 感谢您在基准测试方面所做的努力。我已经扩展了[我的答案,使用基准脚本进行一些额外的技术比较](/sf/answers/3646869271/)。似乎从 PHP7.3 开始,本页上的所有争论都可以得到明确解决,因为“array_key_last()”显然是新的黄金标准。 (2认同)

Rut*_*ren 50

我更喜欢

end(array_keys($myarr))
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`end((array_keys($ myarr)))`来绕过通知. (25认同)
  • 导致STRICT NOTICE,end期望变量引用 (18认同)
  • @BenFortune这已经在PHP7中得到修复:"在PHP 5中,当函数参数通过引用传递时,在函数参数周围使用冗余括号可以安静严格的标准警告.现在将始终发出警告." (8认同)

Pat*_*ski 45

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 )
Run Code Online (Sandbox Code Playgroud)

将输出

orange
Run Code Online (Sandbox Code Playgroud)

  • Horray!我准备添加这个答案.你能突出"PHP 7.3"版本和2018年吗?为别人发现这个令人敬畏的新闻会更容易 (4认同)
  • 值得一提的是,这不会影响内部数组指针。 (4认同)

小智 30

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

  • 这只适用于数字数组.与关联数组失败. (75认同)
  • 这不仅仅适用于数值数组,它无法显示键但显示值,不是吗? (11认同)
  • 此外,即使对于数值数组,请记住数值数组不必按顺序排列,或使用所有数字.如果你没有明确地指定数值,这将有效,但如果你做`$ a [1] = 1; $ a [5] = 5; $ a [0] = 0;`那么你将得到一个带有键(1,5,0)的数组.`count($ a)`将产生3并且$ $ a [2]`未定义.它肯定不会给你5回. (5认同)
  • 再次阅读问题“如何获取数组中的最后一个**键**?” (2认同)

小智 20

不知道这是否会更快或更快,但这样做似乎更容易,并且通过不将函数传递给end()来避免错误...

它只需要一个变量......编写一行代码并不是什么大不了的事,如果你需要,可以取消它.

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

$keys = array_keys($array);
$last = end($keys);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案(虽然在技术上是正确的)是浪费/低效的,因为它需要创建一个额外的数组(与原始数据长度相等).这意味着废物会随着原始阵列的增加而增加.绝不应该选择Pascal MARTIN的高效答案.我很惊讶这有很多赞成. (2认同)

mic*_*usa 11

PHP7.3开始,您可以使用array_key_last()直接访问数组(外层)中的最后一个键

这意味着您无需检索最终密钥的值:

  1. 移动数组指针(需要两行代码)或
  2. 排序,反转,弹出,计数,索引一系列键或任何其他tomfoolery

这个功能早就应该是阵列功能工具带的一个受欢迎的附加功能,可以提高性能,避免不必要的副作用,并实现干净/直接/直观的代码.

这是一个演示:

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015
Run Code Online (Sandbox Code Playgroud)

输出:

$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);
}
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • array_key_last()array_key_first()的兄弟函数.
  • 这两个函数都是"指针无知".
  • null如果数组为空,则两个函数都返回.
  • 丢弃的兄弟功能(array_value_first()&array_value_last())也会提供指针无知访问书挡元素,但他们显然未能获得足够的投票来生活.

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

  • 这个答案应该位于列表的顶部。简直就完整了。 (2认同)

Hil*_*oro 9

从 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
Run Code Online (Sandbox Code Playgroud)

将其与

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Run Code Online (Sandbox Code Playgroud)

如果您使用end()key()


cod*_*ict 8

尝试使用array_poparray_keys函数,如下所示:

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

  • 如果您的数组中包含多个内容,则此操作非常慢.请不要这样做. (14认同)
  • 并导致STRICT NOTICE,变量参考 (3认同)

Ale*_*lex 5

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

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