栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在不删除数组的情况下获取数组最后一个元素的最佳方法是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在不删除数组的情况下获取数组最后一个元素的最佳方法是什么?

此主题中的许多答案为我们提供了许多不同的选择。为了能够从他们中进行选择,我需要了解他们的行为和表现。在此答案中,我将与您分享我的发现

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]];
  • 这些选项最适合非常大的阵列:
    • 选项.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起)
  • 这些选项 仅应用于自动索引的数组
    • 选项.7。
      $x = $array[count($array)-1];
      (由于使用
      count
    • 选项.9。
      $x = $array[] = array_pop($array);
      (由于分配了丢失原始密钥的值)
  • 此选项 不保留数组的内部指针
    • 选项.5。
      $x = end($array); reset($array);
  • 此选项是对 .5选项的 修改 保留数组的内部指针(但遗憾的是,对于非常大的数组,它不能很好地扩展)
    • 选项.6。
      $x = end((array_values($array)));
  • array_key_last
    功能似乎没有上述限制,但在撰写本文时仍是RC(因此请使用RC或等待其于2018年12月发布):
    • 选项10.
      $x = $array[array_key_last($array)];
      (自PHP 7.3起)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号