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

评论

应该指定关联数组,数值数组,或者必须同时使用两者。

常见问题

#1 楼

一个解决方案是结合使用endkey(引号):



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)


ie数组最后一个元素的键。

完成此操作后,数组的内部指针将位于数组的末尾。正如注释中指出的那样,您可能需要在数组上运行reset(),以将指针带回到数组的开头。

评论


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

– Pascal MARTIN
2010-2-27在17:16

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

–卢卢
2015年12月8日在23:01

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

– Marc
16年2月12日在15:50

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

–杰夫
16 Mar 9 '16 at 16:41

@pppp它不起作用,因为...检查end()返回的内容,然后再考虑;)

–福斯伯格
18 Mar 7 '18 at 17:24

#2 楼

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

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


如测试所示,在具有500000个元素的数组上,它的速度几乎快7倍!

评论


对此答案感到兴奋,我进行了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年9月26日上午7:00

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

– dmmd
13年3月18日在4:32



end()最快,因为它可以从非常简单的C函数派生而来,例如:int top(void){int i; for(i = 0; stack [i]!='\ 0'; i ++);返回堆栈[--i]; }

–古斯塔夫
13年6月18日在18:37

@Gustav我相信PHP的底层C实现实际上是在最后一个元素的内部有一个内部指针。使end()几乎等于O(1)。 :-)

–埃里克
2014年8月5日在8:55



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

–datasn.io
2015年4月3日,9:51



#3 楼

从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


评论


霍雷!我正要添加这个答案。您能否强调“ PHP 7.3”版本和2018年?为其他人发现这个很棒的新闻会更容易

–TomášVotruba
18年8月16日在21:18

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

–mvorisek
19年6月6日在9:57

#4 楼

我更喜欢

end(array_keys($myarr))


评论


引起STRICT NOTICE,最终需要一个可变的引用

–威廉
2012-09-11 18:44



您可以使用end((array_keys($ myarr)))绕过通知。

–本财富
13年11月25日在16:01

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

– Dominic Sc​​heirlinck
16年1月18日在1:05

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

–azerafati
16年6月6日在16:38

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

–urchks
16年9月1日在23:29

#5 楼

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

评论


仅当您具有数值数组时,这才有效。与关联数组失败。

– Jeremy J Starcher
2012年9月21日下午4:15

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

–内南
13-10-22在7:59

我也很高兴,我们能做点什么,将Google热门搜索(无论是数值型还是关联型)拆分,以便我们对这两者都有一个较早的参考...我只是在解析int top之后才将其用于assoc (void){int i; for(i = 0; stack [i]!='\ 0'; i ++);返回堆栈[--i]; }这很有趣,但对您的时间预算却不利。

–哈哈
14年4月24日在16:32

此外,即使对于数字数组,也请记住,数字数组不必按顺序排列或使用所有数字。如果您没有显式分配数字值,但如果您执行$ a [1] = 1,则此方法有效。 $ a [5] = 5; $ a [0] = 0;然后,您将获得一个具有键(1、5、0)的数组。 count($ a)将产生3,而$ a [2]未定义。它肯定不会给您5的回报。

–丹尼尔·斯卡贝克(Daniel Skarbek)
2014年7月10日在1:33

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

–user5490177
19年11月9日,12:52

#6 楼

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

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

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

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


评论


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

– mickmackusa
17年4月19日在5:17

#7 楼

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

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


https://laravel-news.com / outer-array-functions-php-7-3
https://kinsta.com/blog/php-7-3/#array-key-first-last
https:// wiki。 php.net/rfc/array_key_first_last

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



评论


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

–约翰
19-10-27在4:58

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

– mickmackusa
20-4-18在4:20



#8 楼

尝试按如下所示使用array_pop和array_keys函数:

<?php

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

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

?>


评论


如果您的数组中包含1个以上的东西,这真的很慢。请不要这样做。

–安德烈
2010-10-7 18:11

并引起“严格通知”,变量参考

–威廉
2012年9月11日18:44

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

–Programster
17年1月13日在8:04

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

– Petko Bossakov
17年1月23日在7:16

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

– mickmackusa
17年4月19日在5:43

#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


将其与

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

如果结合使用end()key()的组合,则必须将数组重置为从开头开始的指针。

#10 楼

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

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

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

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

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


这将为您提供:


int(1)



评论


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

– kakoma
2015年4月21日在8:32

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

–user2732377
15年4月22日在13:22

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

–user2732377
2015年4月30日10:49



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

– mickmackusa
17年4月19日在5:49

#11 楼

您可以使用此功能:

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


评论


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

–马丁
15年11月17日在13:08

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

– Atif Tariq
2015年11月17日下午13:22

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

–马丁
2015年11月17日下午13:27

马丁,哪一行。

– Atif Tariq
2015年11月17日下午13:38

函数中的行

–马丁
2015年11月17日15:04

#12 楼

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


评论


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

– mickmackusa
17年4月19日在5:33

#13 楼

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


#14 楼

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

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

#15 楼

尝试使用array_reverse()进行此操作。

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


#16 楼

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

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


之所以有效,是因为PHP在$ array
内部移动了它的数组指针

评论


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

– mickmackusa
17年4月19日在5:35

#17 楼

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

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


此解决方案仅是表达式/语句,提供的性能不是最佳可能。

内联示例用法:

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



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

#18 楼

或者在php >= 7.3.0
中可以使用函数array_key_last()
,如php.net中所述—获取数组的最后一个键
https://www.php.net/manual/zh/function .array-key-last.php