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

相关文章

来自专栏Golang语言社区

golang的内存模型与new()与make()

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|dat...

2956
来自专栏GreenLeaves

Proxy代理模式(结构型模式)

在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失...

1253
来自专栏王亚昌的专栏

Golang 中的“潜规则”

./example_struct2binary.go:21: head.ver undefined (cannot refer to unexported fi...

892
来自专栏我爱编程

Day14IO编程

读文件 Python引入了with语句来自动帮我们调用close()方法: with open('/path/to/file', 'r') as f: ...

3215
来自专栏Pulsar-V

CTF随笔(二)

##PWN001 ssh fd@pwnable.kr -p2222 (pw:guest) 送分题 ? #include <stdio.h> #includ...

2816
来自专栏Java技术

Redis常见的5种不同的数据类型详解

Redis除了可以存储键还可以存储常见的5种数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令有一部分是可以公用的,但是...

861
来自专栏散尽浮华

Python介绍

Python概述 Python创始人是吉多.范罗苏姆。在1989年万圣节期间为打发时间而开发的。 目前Python在TIOBE排行榜第五位置 ? Python可...

29310
来自专栏逆向技术

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

       框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如  CObje...

2056
来自专栏静默虚空的博客

Shell 快速指南

Shell 快速指南 ███████╗██╗ ██╗███████╗██╗ ██╗ ██╔═══...

27110
来自专栏开源优测

JMeter函数和变量11

前言 在jmeter中提供了功能强大的内置函数来帮助我们处理字符串、文件读写、计算、运行外部脚本等等能力。 要想在项目中切实运用来jmeter完成复杂的压测场景...

4046

扫码关注云+社区