PHP开发过程的那些坑(三) ——PHParray_shift函数

PHP开发过程的那些坑(三)——PHP array_shift函数

(原创内容,转载请注明来源,谢谢)

坑:

最近在自学数据结构,常常用PHP实现各种数据结构和算法。array_shift函数的作用是获取数组的第一个元素,并将其从数组中剔除。用array_shift+array_push可以实现队列的操作。例如官方手册的例子:

    $stack = array("orange", "banana", "apple", "raspberry");
    $fruit = array_shift($stack);
    print_r($stack);

结果是

Array( [0] => banana [1] => apple [2]=> raspberry)

但是,当遇到二维数组时,情况就不一样了。

$testArr =array(‘a’=>1, ‘b’=>2, ’c’=>3);
print_r(array_shift($testArr));//输出 1
print_r($testArr);//输出 Array([0]=>2, [1]=>3)

数组的下标都被改变了!

分析:

再经过几次代码调试后,发现确实array_shift函数会改变数组的下标。查阅网上资料,有一篇文章写的很好,https://my.oschina.net/u/437615/blog/297378。这篇文章是分析为什么PHP的array_shift和array_pop同样作为剔除数组的一个元素,性能上的差异非常大。

原因是,array_shift在剔除掉第一个元素后,会对数组进行重新排序。这会导致数组量大的时候,array_shift的速度会慢的无法忍受。

当然,这也就是我遇到的问题的原因。

改进措施:

将二维数组扩展成三维数组

$testArr =array(0=>array(‘a’=>1), 1=>array(‘b’=>2), 2=>array(’c’=>3));
print_r(array_shift($testArr));//输出 array(‘a’=>1)
print_r($testArr);//输出 Array([0]=>array(‘b’=>2), array(’c’=>3))

再用foreach的方式获取自己想要的内容。这样即保留了想要的数组下标,又能实现剔除数组的第一个元素。

——written by linhxx 2017.07.09

相关阅读:

PHP开发过程的那些坑(二) ——PHP empty函数

PHP开发过程的那些坑(一) ——对象拷贝

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏十月梦想

JavaScript字符串类型转换

614
来自专栏云瓣

从 JavaScript 到 TypeScript

TypeScript 并不是一个完全新的语言, 它是 JavaScript 的超集,为 JavaScript 的生态增加了类型机制,并最终将代码编译为纯粹的 J...

2364
来自专栏前端新视界

相邻不重复随机数的生成及优化

生成相邻不重复随机数是之前抽奖插件的遗留问题,在之前的文章中已经简单说过,但没有更好的解决方案。经过一个多月的修改,抽奖插件已经趋于完善,在此分享一下这个问题的...

2095
来自专栏申龙斌的程序人生

零基础学编程011:复利数据表问题(总结)

问题描述: 用Python语言输出365行的《复利数据表》: (1+0.01) ^ 1 = 1.01 (1+0.01) ^ 2 = 1.02 (1+0.01)...

2908
来自专栏IMWeb前端团队

操作符混淆工具

1 序 1.1 从一段神奇的JS代码说起 前段时间在公众号看到一段神奇的代码,它长这个样子: (!(~+[])+{})[--[~[]][+[]]*[~+[]]+...

1947
来自专栏大壮

UIKit框架 - TextKit

1694
来自专栏java思维导图

Getter & Setter:使用还是废弃

私有变量 为什么我们要使用私有的实例变量呢? 因为我们不希望其他类直接的依赖于这些变量。而且在心血来潮时,我们还可以灵活的修改变量类型和实现。 然而,为什么程序...

2656
来自专栏猿人谷

memcpy和memmove的区别

memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下: void *memcpy(void *dst, con...

1945
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(String专栏)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

622
来自专栏Python小屋

Python语言编程规范与优化建议

没有规矩,不成方圆。代码任何一种语言都有一些约定俗成的编码规范,Python也不例外。Python非常重视代码的可读性,对代码布局和排版有更加严格的要求。虽然一...

2454

扫描关注云+社区