好,
我知道所有关于array_pop(),但删除了最后一个元素 . 获取数组的最后一个元素而不删除它的最佳方法是什么?
编辑:这是一个奖金:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
甚至
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
24 回答
要获取数组的最后一个元素,请使用:
Benchmark
我迭代了1000次,分别 grab 了包含100和50,000个元素的小型和大型数组的最后一个元素 .
我使用PHP版本5.5.32 .
另一种可能的解决方案
我认为这对所有现有答案都略有改进:
使用
array_keys()
执行优于end()
或解决方案,特别是对于大型数组赢了't modify the array'的内部指针
不会尝试访问空数组的未定义偏移量
将按预期为空数组,索引数组,混合数组和关联数组工作
如果您不关心修改内部指针(支持索引和关联数组):
如果你想要一个不修改内部指针的实用程序函数(因为数组是按值传递的,并且函数在它的副本上运行):
请注意,PHP生成副本"on-the-fly",即仅在实际需要时 .
end()
本身修改了数组,因此在内部生成了数组的副本 .因此,以下替代方案实际上更快,因为内部它不复制数组,它只是一个切片:
这个“foreach / return”是一个有效获得第一个(此处是单个)项目的调整 .
最后,最快的替代方案,但仅适用于索引数组:
end()将提供数组的最后一个元素
array_slice($array, -1)
有什么问题? (见手册:http://us1.php.net/array_slice)array_slice()
返回一个数组 . 可能不是你想要的 . 你想要的元素 .要做到这一点并避免使用E_STRICT而不是弄乱阵列的内部指针,您可以使用:
lelement只能与副本一起使用,因此它不会影响数组的指针 .
没有修改$ array指针 . 这避免了
在某些条件下可能不需要 .
另一种方案:
怎么样:
适用于关联数组
在
$array == []
(返回false
)时有效不会影响原始数组
为了我:
使用关联:
最好的答案很棒,但正如@ paul-van-leeuwen和@ quasimodos-clone所提到的,PHP 7.3将引入两个新函数来直接解决这个问题 - array_key_first()和array_key_last() .
您现在可以使用以下polyfill(或shim)函数开始使用此语法 .
警告:这需要PHP 5.4或更高版本 .
从PHP 7.3版开始,引入了函数
array_key_first
和array_key_last
.由于PHP中的数组不是严格的数组类型,即从索引0开始的固定大小字段的固定大小的集合,而是动态扩展的关联数组,因此处理具有未知键的位置是困难的,并且变通方法执行得不是很好 . 相比之下,实数数组将通过指针算术非常快速地内部寻址,并且最后一个索引在编译时通过声明已知 .
至少从第7.3版开始,内置函数解决了第一个和最后一个位置的问题 . 这甚至可以在没有任何关于阵列文字的警告的情况下开箱即用:
显然最后一个值是:
简单地说:
$last_element = end((array_values($array)))
不重置阵列,也不会发出STRICT警告 .
PS . 由于投票最多的答案仍然没有双括号,我提交了这个答案 .
在几乎所有带阵列的语言中,A [A.size-1]都不会出错 . 我想不出一个基于1个数组的语言的例子(而不是基于零的) .
避免传递引用错误的一种方法(例如“end(array_values($ foo))”)是使用call_user_func或call_user_func_array:
如果你想在它的数组循环中得到数组的最后一个元素怎么办?
下面的代码将导致无限循环:
对于非关联数组,解决方案显然很简单:
尝试
要重置它(感谢@hopeseekr):
链接到manual
@David Murdoch补充道:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
在E_STRICT上,这会产生警告谢谢o_O Tync和大家!
我经常需要这个来处理堆栈,而且我总是觉得自己很困惑,没有本机函数可以在没有以某种形式操纵数组或其内部指针的情况下执行它 .
所以我通常带有一个util函数,它也可以安全地用在关联数组上 .
这个帖子中的许多答案为我们提供了许多不同的选择 . 成为能够从中选择我需要了解他们的行为和表现 . 在这个答案中,我将与您分享我的发现,以PHP版本
5.6.38
,7.2.10
和7.3.0RC1
(expected Dec 13 2018)为基准 .我将测试的选项(
<<option code>>
s)是:option .1.
$x = array_values(array_slice($array, -1))[0];
option .2.
$x = array_slice($array, -1)[0];
option .3.
$x = array_pop((array_slice($array, -1)));
option .4.
$x = array_pop((array_slice($array, -1, 1)));
option .5.
$x = end($array); reset($array);
option .6.
$x = end((array_values($array)));
option .7.
$x = $array[count($array)-1];
option .8.
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
(as suggested by thrau)option .9.
$x = $array[] = array_pop($array);
(as suggested by user2782001)option 10.
$x = $array[array_key_last($array)];
(as suggested by Quasimodo's clone;根据PHP 7.3提供)测试输入(
<<input code>>
s)与:null =
$array = null;
empty =
$array = [];
last_null =
$array = ["a","b","c",null];
auto_idx =
$array = ["a","b","c","d"];
shuffle =
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
100 =
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
100000 =
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
为了测试,我将使用
5.6.38
,7.2.10
和7.3.0RC1
docker容器,如:上面列出的
<<option code>>
和<<input code>>
的每个组合都将在所有版本的PHP上运行 . 对于每次测试运行,使用以下代码段:对于每次运行,这将var_dump最后检索的测试输入的最后一个值,并打印一次迭代的平均持续时间in femtoseconds(0.000000000000001th of of second) .
结果如下:
上面提到的 F atal, W arning和 N otice代码翻译为:
基于此输出,我得出以下结论:
较新版本的PHP表现更好,但这些选项变得非常慢:
option .6.
$x = end((array_values($array)));
option .8.
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
这些选项最适合非常大的数组:
option .5.
$x = end($array); reset($array);
option .7.
$x = $array[count($array)-1];
option .9.
$x = $array[] = array_pop($array);
option 10.
$x = $array[array_key_last($array)];
(自PHP 7.3起)这些选项应 only be used for auto-indexed arrays :
option .7.
$x = $array[count($array)-1];
(由于使用count
)option .9.
$x = $array[] = array_pop($array);
(由于分配值丢失原始密钥)此选项 does not preserve the array's internal pointer
option .5.
$x = end($array); reset($array);
此选项试图修改 option .5. 以保留数组的内部指针(但遗憾的是,对于非常大的数组,它不能很好地扩展)
option .6.
$x = end((array_values($array)));
新
array_key_last
函数似乎没有上述限制,但在撰写本文时仍然是RC(因此请使用RC或等待它发布于2018年12月):option 10.
$x = $array[array_key_last($array)];
(自PHP 7.3起)有点取决于using the array as stack or as queue你是否可以在选项9上做出变化 .
要从Array获取最后一个值:
对于删除最后一个值表单数组:
未经测试:这不会起作用吗?
由于array_values返回的数组是短暂的,所以没有人关心它的指针是否被重置 .
如果你需要钥匙,我想你会这样做:
简短又甜蜜 .
我想出了解决方案来删除错误消息并保留单行表单和高效性能:
注意:需要额外的括号来避免
PHP Strict standards: Only variables should be passed by reference
.