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


Answers:


610

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

  • end() 将array的内部指针前进到最后一个元素,并返回其值。
  • 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()在数组上运行以将指针带回到数组的开头。


17
@Pim:取决于OP想要在该数组之后做什么(可能不需要调用reset();; 但您正确地指出了该功能,这可能会很有用。
Pascal MARTIN

3
@PascalMARTIN +1我认为在您的答案中添加有关reset()的注释将非常有帮助。
露露2015年

如果数组具有重复值,则此方法不起作用。例如。对于array('a', 'b', 'c', 'd', 'a')它将返回键0,而不是4
马克

2
@Marc即使存在重复值,此方法也可以正常工作。
杰夫

1
@pppp它不起作用,因为...检查end()返回什么,然后再考虑;)
forsberg

79

尽管end()看似最简单,但却不是最快的。更快,更强大的替代方法是array_slice()

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

如测试所示,在具有500000个元素的阵列上,速度快将近7倍!


98
对此答案感到兴奋,我进行了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秒...
neokio 2012年

54
PHP的内置函数由极端的书呆子构建。不要尝试重新创建这些功能。很有可能您制作的东西要比原始东西慢得多。除非你是某种邪恶的巫师,否则会。
2013年

16
end()之所以最快,是因为它可以源自非常简单的C函数,例如:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav

10
@Gustav我相信PHP的底层C实现实际上具有指向last最后一个元素的内部指针。使end()几乎O(1)。:-)
埃里克

15
@dmmd,我敢肯定PHP团队会非常高兴他们被称为书呆子。
datasn.io 2015年

53

我更喜欢

end(array_keys($myarr))

19
导致发出“严厉通知”,最终要求可变参考
Wiliam 2012年

25
您可以end((array_keys($myarr)))用来绕过通知。
Ben Fortune

9
@BenFortune在PHP7中已解决此问题:“在PHP 5中,通过引用传递功能参数时,在功能参数周围使用多余的括号可以使严格的标准警告静音。现在将始终发出警告。”
Dominic Sc​​heirlinck

那是完全不必要的警告!这是所有其他语言中如此普通的东西!
azerafati

1
用其他语言,这些函数不能对指针进行操作,对吗?
jurchiks

52

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

4
霍雷!我正要添加这个答案。您能否强调“ PHP 7.3”版本和2018年?它会更容易发现这个真棒消息为他人
托马什Votruba

还值得一提的是,这不会影响内部数组指针。
mvorisek

30

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


75
仅当您具有数值数组时,此方法才有效。与关联数组失败。
杰里米·J·斯塔彻

12
这不仅仅适用于数字数组,而且不能显示键,但可以显示值,不是吗?
Nanne

我也很高兴,我们能做点什么,我们将这个(让我说实话)顶级google hit分为数值型和关联型,以便我们对两者都有一个旧的参考...我只算出解析后的assoc int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }是有趣,但对您的时间却不利于生意
大声笑

5
另外,即使对于数字数组,也请记住,数字数组不必按顺序排列或使用所有数字。如果您未显式分配数字值,则此方法将起作用,但如果您这样做$a[1] = 1; $a[5] = 5; $a[0] = 0;,则将具有按顺序排列的键(1、5、0)数组。 count($a)将产生3 $a[2]且未定义。它肯定不会给您5的回报。
Daniel Skarbek 2014年

1
再次阅读问题“如何获取数组中的最后一个?”

20

不知道这是否会更快,但是用这种方法似乎更容易,并且可以通过不将函数传递给end()来避免错误。

它只需要一个变量...再写一行代码就没什么大不了的,然后在需要时取消设置。

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

$keys = array_keys($array);
$last = end($keys);

2
这个答案(虽然在技术上是正确的)是浪费/低效的,因为它需要创建一个附加数组(长度与原始数组相等)。这意味着浪费会随着原始阵列的增加而增加。永远不要选择Pascal MARTIN的有效答案。我感到惊讶的是,它有这么多的支持。
mickmackusa

12

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的回答下评论的初始基准

这意味着您无需以下操作即可检索最终键的值:

  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())也会提供对书挡元素的无指针访问,但是显然,它们无法获得足够的票数才能生效。

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

ps如果有人在权衡其他一些技术,则可以参考以下比较小集:(Demo

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

2
这个答案应该在列表的顶部。简单完成。
约翰,

1
哇,我这个答案的DV?到底是什么问题,过于全面/确定/解释/支持?Pfft。绝对会继续拒绝那些敢于告知的帖子。做得好。如果您不知道,DV按钮用于“无用”的帖子。请问自己您的目标是什么。
mickmackusa

8

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

<?php

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

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

?>

14
如果您的数组中包含多于一件的东西,这真的很慢。请不要这样做。
安德烈

3
并导致“严格通知”,可变参考
Wiliam 2012年

array_pop()将缩短原始数组(删除最后一个元素)。我不确定这对OP是否重要,但对其他人肯定很重要。
Programster

1
并不是的。在此示例中,array_pop()对的返回值进行操作array_keys()而不对原始数组进行操作。
Petko Bossakov

因为还有其他更有效的答案不会触发NOTICE,所以我拒绝了此答案。
mickmackusa

6

从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()


4

我还想为这个问题提供替代解决方案。

假设所有键都是数字,没有任何间隙,我的首选方法是对数组进行计数,然后从该值减去1(以说明数组键从0开始的事实。

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

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

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

这将为您提供:

int(1)猫


1
这不适用于键不是增量的数组,例如array(0 =>'dog',5 =>'cat'); $ lastKey将返回错误的值
kakoma 2015年

@kakoma-正如我的帖子所述:“假设您的所有键都是数字,没有任何间隙”。

对于任何想知道使用PHP的“ array_values”将数组重新设置为数字顺序键的人。php.net/manual/en/function.array-values.php

1
因为此答案仅处理部分数组可能性(数字,连续键控数组),所以此答案不能为OP的广义问题提供可靠/正确的答案。下注。
mickmackusa

4

您可以使用此:

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

1
该答案没有提供该线程中没有的新内容。
马丁

1
马丁,没有人使用函数来获得结果。
Atif Tariq

1
您是否需要在函数中添加1行代码?那是一个相当不必要的界面。
马丁

1
马丁,哪一行。
Atif Tariq,2015年

2
您职能中的界限
Martin

3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3

2
仅反转整个数组以提取一个值肯定比PascalMARTIN的方法效率低。即使从技术上讲它是正确的,也绝不能代替Pascal的方法使用它。
mickmackusa

3

我只是从Xander那里获得了helper功能,并通过之前的答案对其进行了改进:

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


1

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

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


0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

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

这行得通,因为PHP在$ array内部移动了它的数组指针


2
这是PascalMARTIN方法的重复。请保留此页面并删除您的最新答案。不赞成投票。
mickmackusa

0

也可以在线使用的最佳解决方案:

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

该解决方案仅是表达/陈述,并提供好的不是最佳的性能。

内联示例用法:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


更新:在PHP 7.3+中:(当然)使用新添加的array_key_last()方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.