此主题中的许多答案为我们提供了许多不同的选择。为了能够从他们中进行选择,我需要了解他们的行为和表现。在此答案中,我将与您分享我的发现
5.6.38,
7.2.10并针对PHP版本和
7.3.0RC1(预计2018年12月13日)进行测试。
<<option pre>>我将测试的选项是:
- 选项1。
$x = array_values(array_slice($array, -1))[0];
- 选项.2。
$x = array_slice($array, -1)[0];
(所建议的通过[ Stoutie] - 选项.3。
$x = array_pop((array_slice($array, -1)));
- 选项.4。
$x = array_pop((array_slice($array, -1, 1)));
- 选项.5。
$x = end($array); reset($array);
- 选项.6。
$x = end((array_values($array)));
- 选项.7。
$x = $array[count($array)-1];
- 选项.8。
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
- 选项.9。
$x = $array[] = array_pop($array);
- 选项10.
$x = $array[array_key_last($array)];
_(提到的功能: array_key_last,array_keys,array_pop,array_slice,array_values,count,end,reset
测试输入
<<input pre>>与以下各项组合:
- 空 =
$array = null;
- 空 =
$array = [];
- last_null =
$array = ["a","b","c",null];
- auto_idx =
$array = ["a","b","c","d"];
- 随机播放 =
$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
PHP搬运工容器,如:
sudo docker run -it --rm php:5.6.38-cli-stretch php -r '<<<CODE HERE>>>'
上面列出的
<<option pre>>s和
<<inputpre>>s的每种组合都将在所有版本的PHP上运行。对于每个测试运行,都使用以下代码片段:
<<input pre>> error_reporting(E_ALL); <<option pre>> error_reporting(0); $before=microtime(TRUE); for($i=0;$i<100;$i++){echo ".";for($j=0;$j<100;$j++){ <<option pre>> }}; $after=microtime(TRUE); echo "n"; var_dump($x); echo round(($after-$before)/(100*100)*1000*1000*1000);对于每次运行,这将var_dump转储测试输入的最后一个检索到的最后一个值,并打印一次迭代的平均持续时间(以飞秒为单位)(0.000000000000001秒)。
结果如下:
/==========================================================================================================================================================================================================================================================================================================================================================================================================================|| || T E S T I N P U T - 5 . 6 . 3 8 || T E S T I N P U T - 7 . 2 . 1 0 || T E S T I N P U T - 7 . 3 . 0 R C 1 |||| || null | empty | last_null | auto_idx | shuffle |100 | 100000 || null | empty | last_null | auto_idx | shuffle |100 | 100000 || null | empty | last_null | auto_idx | shuffle |100 | 100000 ||||============================OPTIONS - ERRORS==========================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<||| 1. $x = array_values(array_slice($array, -1))[0]; || W1 + W2 | N1 | - | - | - | - | - || W1 + W2 | N1 | - | - | - | - | - || W1 + W2 | N1 | - | - | - | - | - |||| 2. $x = array_slice($array, -1)[0]; || W1 | N1 | - | - | - | - | - || W1 | N1 | - | - | - | - | - || W1 | N1 | - | - | - | - | - |||| 3. $x = array_pop((array_slice($array, -1)));|| W1 + W3 | - | - | - | - | - | - || W1 + N2 + W3 | N2 | N2 | N2 | N2 | N2 | N2 || W1 + N2 + W3 | N2 | N2 | N2 | N2 | N2 | N2 |||| 4. $x = array_pop((array_slice($array, -1, 1))); || W1 + W3 | - | - | - | - | - | - || W1 + N2 + W3 | N2 | N2 | N2 | N2 | N2 | N2 || W1 + N2 + W3 | N2 | N2 | N2 | N2 | N2 | N2 |||| 5. $x = end($array); reset($array); || W4 + W5 | - | - | - | - | - | - || W4 + W5 | N2 | N2 | N2 | N2 | N2 | N2 || W4 + W5 | - | - | - | - | - | - |||| 6. $x = end((array_values($array))); || W2 + W4 | - | - | - | - | - | - || W2 + N2 + W4 | - | - | - | - | - | - || W2 + N2 + W4 | N2 | N2 | N2 | N2 | N2 | N2 |||| 7. $x = $array[count($array)-1]; || - | N3 | - | - | - | - | - || W7 | N3 | - | - | - | - | - || W7 | N3 | - | - | - | - | - |||| 8. $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; || W6 | N3 + N4 | - | - | - | - | - || W6 + W7 | N3 + N4 | - | - | - | - | - || W6 + W7 | N3 + N4 | - | - | - | - | - |||| 9. $x = $array[] = array_pop($array); || W3 | - | - | - | - | - | - || W3 | - | - | - | - | - | - || W3 | - | - | - | - | - | - |||| 10. $x = $array[array_key_last($array)]; || F1 | F1 | F1 | F1 | F1 | F1 | F1 || F2 | F2 | F2 | F2 | F2 | F2 | F2 || W8 | N4 | F2 | F2 | F2 | F2 | F2 ||||========================OPTIONS - VALUE RETRIEVED=====================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<||| 1. $x = array_values(array_slice($array, -1))[0]; || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 2. $x = array_slice($array, -1)[0]; || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 3. $x = array_pop((array_slice($array, -1)));|| NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 4. $x = array_pop((array_slice($array, -1, 1))); || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 5. $x = end($array); reset($array); || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 6. $x = end((array_values($array))); || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | bool(false) | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 7. $x = $array[count($array)-1]; || NULL | NULL | NULL | string(1) "d" | string(1) "b" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "b" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "b" | int(99) | int(99999) |||| 8. $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 9. $x = $array[] = array_pop($array); || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) || NULL | NULL | NULL | string(1) "d" | string(1) "c" | int(99) | int(99999) |||| 10. $x = $array[array_key_last($array)]; ||N/A |N/A |N/A |N/A |N/A |N/A |N/A ||N/A |N/A |N/A |N/A |N/A |N/A |N/A ||N/A |N/A |N/A |N/A |N/A |N/A |N/A ||||=================OPTIONS - FEMTOSEConDS PER ITERATION=================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<||| 1. $x = array_values(array_slice($array, -1))[0]; ||803 |466 |390 |384 |373 |764 | 1.046.642 ||691 |252 |101 |128 | 93 |170 | 89.028 ||695 |235 | 90 | 97 | 95 |188 | 87.991 |||| 2. $x = array_slice($array, -1)[0]; ||414 |349 |252 |248 |246 |604 | 1.038.074 ||373 |249 | 85 | 91 | 90 |164 | 90.750 ||367 |224 | 78 | 85 | 80 |155 | 86.141 |||| 3. $x = array_pop((array_slice($array, -1)));||724 |228 |323 |318 |350 |673 | 1.042.263 ||988 |285 |309 |317 |331 |401 | 88.363 ||877 |266 |298 |300 |326 |403 | 87.279 |||| 4. $x = array_pop((array_slice($array, -1, 1))); ||734 |266 |358 |356 |349 |699 | 1.050.101 ||887 |288 |316 |322 |314 |408 | 88.402 ||935 |268 |335 |315 |313 |403 | 86.445 |||| 5. $x = end($array); reset($array); ||715 |186 |185 |180 |176 |185 |172 ||674 | 73 | 69 | 70 | 66 | 65 | 70 ||693 | 65 | 85 | 74 | 68 | 70 | 69 |||| 6. $x = end((array_values($array))); ||877 |205 |320 |337 |304 | 2.901 | 7.921.860 ||948 |300 |336 |308 |309 |509 | 29.696.951 ||946 |262 |301 |309 |302 |499 | 29.234.928 |||| 7. $x = $array[count($array)-1]; ||123 |300 |137 |139 |143 |140 |144 ||312 |218 | 48 | 53 | 45 | 47 | 51 ||296 |217 | 46 | 44 | 53 | 53 | 55 |||| 8. $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; ||494 |593 |418 |435 |399 | 3.873 | 12.199.450 ||665 |407 |103 |109 |114 |431 | 30.053.730 ||647 |445 | 91 | 95 | 96 |419 | 30.718.586 |||| 9. $x = $array[] = array_pop($array); ||186 |178 |175 |188 |180 |181 |186 || 83 | 78 | 75 | 71 | 74 | 69 | 83 || 71 | 64 | 70 | 64 | 68 | 69 | 81 |||| 10. $x = $array[array_key_last($array)]; ||N/A |N/A |N/A |N/A |N/A |N/A |N/A ||N/A |N/A |N/A |N/A |N/A |N/A |N/A ||370 |223 | 49 | 52 | 61 | 57 | 52 || =========================================================================================================================================================================================================================================================================================================================================================================================================================/
上述 ˚F 阿塔尔贝哈, w ^ arning和 Ñ otice代码翻译为:
F1 = Fatal error: Call to undefined function array_key_last() in Command line pre on line 1F2 = Fatal error: Uncaught Error: Call to undefined function array_key_last() in Command line pre:1W1 = Warning: array_slice() expects parameter 1 to be array, null given in Command line pre on line 1W2 = Warning: array_values() expects parameter 1 to be array, null given in Command line pre on line 1W3 = Warning: array_pop() expects parameter 1 to be array, null given in Command line pre on line 1W4 = Warning: end() expects parameter 1 to be array, null given in Command line pre on line 1W5 = Warning: reset() expects parameter 1 to be array, null given in Command line pre on line 1W6 = Warning: array_keys() expects parameter 1 to be array, null given in Command line pre on line 1W7 = Warning: count(): Parameter must be an array or an object that implements Countable in Command line pre on line 1W8 = Warning: array_key_last() expects parameter 1 to be array, null given in Command line pre on line 1N1 = Notice: Undefined offset: 0 in Command line pre on line 1N2 = Notice: only variables should be passed by reference in Command line pre on line 1N3 = Notice: Undefined offset: -1 in Command line pre on line 1N4 = Notice: Undefined index: in Command line pre on line 1
基于此输出,我得出以下结论:
- 较新版本的PHP表现更好,但以下选项变得非常慢:
- 选项.6。
$x = end((array_values($array)));
- 选项.8。
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
- 选项.6。
- 这些选项最适合非常大的阵列:
- 选项.5。
$x = end($array); reset($array);
- 选项.7。
$x = $array[count($array)-1];
- 选项.9。
$x = $array[] = array_pop($array);
- 选项10.
$x = $array[array_key_last($array)];
(自PHP 7.3起)
- 选项.5。
- 这些选项 仅应用于自动索引的数组 :
- 选项.7。
$x = $array[count($array)-1];
(由于使用count
) - 选项.9。
$x = $array[] = array_pop($array);
(由于分配了丢失原始密钥的值)
- 选项.7。
- 此选项 不保留数组的内部指针
- 选项.5。
$x = end($array); reset($array);
- 选项.5。
- 此选项是对 .5选项的 修改 。 保留数组的内部指针(但遗憾的是,对于非常大的数组,它不能很好地扩展)
- 选项.6。
$x = end((array_values($array)));
- 选项.6。
- 新
array_key_last
功能似乎没有上述限制,但在撰写本文时仍是RC(因此请使用RC或等待其于2018年12月发布):- 选项10.
$x = $array[array_key_last($array)];
(自PHP 7.3起)
- 选项10.



