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 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java反射在JVM的实现

反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成为构建灵活...

583
来自专栏xingoo, 一个梦想做发明家的程序员

VS报错:DEBUG Assertion Failed!

使用vs2010时,遇到如下错误 ? 然后点击继续后: ? 点击终止: ? 观察变量: ? 根据提示发现,有可能是断点问题,于是猜想可能是指针的错误。 goog...

2189
来自专栏企鹅号快讯

在PHP中如何使用全局变量的方法详解

简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有:程序设定类、数据库连接类...

18910
来自专栏张善友的专栏

功能强大的JavaScript引擎--SpiderMonkey

JavaScript在浏览器中的应用几乎是尽人皆知的。实际上,JavaScript技术也可以使用在非浏览器应用程序当中,从而让应用程序具有自动的脚本功能。本文介...

1815
来自专栏C/C++基础

*** glibc detected *** malloc(): memory corruption

在Linux Server上不好模拟出来:不过若是先malloc,再越界memset,再free此内存块,然后malloc新内存块就会出现类似错误。

1032
来自专栏Golang语言社区

第九节 Go语言循环语句

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

692
来自专栏腾讯NEXT学位

JavaScript引擎分析

? 一.JavaScript简介 JavaScript是一种动态类型的脚本语言;在1995年时,由Netscape公司的Brendan Eich,在网景导航者...

822
来自专栏V站

如何提高PHP编程效率,提升程序编译质量(53条)

用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串...

1335
来自专栏PHP技术

良好的书写规范提高PHP代码执行效率

用单引号代替双引号来包含字符串,这样做会更快一些。因为 php 会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多...

2545
来自专栏CSDN技术头条

JavaScript内存管理机制以及四种常见的内存泄漏解析

几个星期前,我们开始编写深入研究JavaScript工作原理的系列文章。通过阅读这些文章,你可以了解到JavaScript的构建块及其交互原理,从而能够编写出更...

17710

扫码关注云+社区