资讯专栏INFORMATION COLUMN

[PHP源码阅读]array_push和array_unshift函数

HackerShell / 2046人阅读

摘要:对于函数,实现时新建一个哈希表,将需要插入的数据先插入到中,然后再把原来的数组数据写入到中,这样实现在数组前面插入数据元素的功能。这次阅读源码过程中,同时也研究了中的哈希表数据结构及一些,也给自己补充了一些哈希表的知识。

在PHP中,在数组中添加元素也是一种很常用的操作,分别有在数组尾部和头部添加元素,看看PHP内部是如何实现数组插入的操作。

我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

array_push
int array_push ( array &$array , mixed $value1 [ , mixed $... ] )

array_push函数将array参数看做一个栈,将传递进来的变量压倒array的尾部。array的长度随着被压进去的变量个数增加。下面的代码有意义的效果:

 $array[] = $var; 

如果只需要添加一个元素到数组,使用$array[] 这种方式更好,因为这样做不用调用函数。

运行示例
$arr = array();
array_push($arr, 1, 2, 3); // return 3; $arr = [1, 2, 3]
运行步骤

array_push函数相对比较简单,就相当于压栈操作,把array看做一个栈,然后对每一个参数,让其变成引用,引用数加一,然后添加它到数组的尾部。

内部实现的流程图如下:

源码解读

添加元素使用了zend_hash_next_index_insert函数,此函数是_zend_hash_next_index_insert函数的宏定义,这个函数是PHP内部实现数组的数据结构--哈希表包含的一些API,这个API用于追加元素到哈希表或者更新哈希表中已有的哈希值。此函数实现的流程图如下:

array_unshift
int arrat_unshift ( array &$array , mixed $value1 [ , mixed $... ] )

array_unshift函数将数据元素插入到数组的头部,插入时是作为整体插入,因此后面的参数将保持同样的顺序。插入后所有的数值键名将修改为从零开始计数,所有的文字键名不变。

运行示例
$arr = array(1, 2, 3);
array_unshift($arr, 4, 5, 6); // 4 5 6 1 2 3
运行步骤

1、调用php_splice将数据元素插入到数组头部,用新的哈希表替换就得哈希表并将其销毁

2、如果操作后的stack等于运行时的符号表,则重置哈希表的内部指针

3、stack指向新的哈希表,释放新的哈希表红箭,销毁就得哈希表

源码解读

由上面的步骤可知,array_unshift的核心步骤是php_splice函数。对于array_unshift函数,php_splice实现时新建一个哈希表out_hash,将需要插入的list数据先插入到out_hash中,然后再把原来的数组数据写入到out_hash中,这样实现在数组前面插入数据元素的功能。

实现的效果图如下:

小结

要理解array_push函数的执行过程主要理解栈的思想即可,而array_unshift则是新建一个数组,然后将两数组合并为结果数组。
这次阅读源码过程中,同时也研究了PHP中的哈希表数据结构及一些API,也给自己补充了一些哈希表的知识。学习到了PHP底层是使用双向链表做哈希冲突的处理,获益匪浅。日后再做关于PHP数据结构的分享。

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,点收藏的同时也请点下推荐吧,谢谢^_^

我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

更多源码文章,欢迎访问个人主页继续查看:hoohack

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21620.html

相关文章

  • PHP 学习总结之数组

    摘要:概述我们知道,在编程语言中,数组的使用频率是很高的,几乎每个脚本都会使用到。循环缺点遍历完成之后,不能对数组进行第二次遍历数组内部指针指向了最后一个元素。 概述 我们知道,在 PHP 编程语言中,数组的使用频率是很高的,几乎每个脚本都会使用到。 PHP 自带了大量的、优秀的操作数组的函数以供我们使用,本文就对这些数组函数的使用做一些分类和总结,方便大家以后查阅。 创建 1. range...

    wangdai 评论0 收藏0
  • PHP: array数组常用API

    摘要:语法数组删除数组的最后一项语法数组在数组的最末添加一项语法数组删除数组的首项语法数组在数组的首部添加一项案例分析 1:数组的指针操作: 语法:current(数组) 当前指针指向的单元值(默认是第零个)语法 next(数组) 当前指针往下移动一帧语法 prev(数组) 当前指针往前移动一个指针语法 end(array) 将当前指针移动到最后一项语法 ...

    Cheriselalala 评论0 收藏0
  • PHP数组操作详解

    摘要:像其他变量一样,使用运算符可以改变数组元素的内容。数组的基本操作定义数组在中声明数组的方式主要有两种用函数声明数组,直接为数组元素赋值。 概述 要访问一个变量的内容,可以直接使用其名称。如果该变量是一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。 像其他变量一样,使用运算符=可以改变数组元素的内容。数组单元可以通过 array[key] 语法来访问。 showImg(...

    Guakin_Huang 评论0 收藏0
  • 100 个最常用的 PHP 函数

    摘要:下面的列表是最常用的前个函数它们是最常用的中自带的函数。这些函数被命名使用,并从到进行排序。排行函数频率平均值前分析最常用的函数是字符串函数,然后是数组函数,接着是文件函数。以上个函数没有近期要废弃的计划。是最常用的加密函数,其次是。 showImg(https://segmentfault.com/img/remote/1460000018674936?w=600&h=293); 下...

    novo 评论0 收藏0
  • PHP面试之四:逻辑与算法

    摘要:数据结构常见数据结构数组是最简单而且应用最广泛的数据结构特征使用连续内存空间来存储存放相同类型或着衍生类型的元素数组比较特别,可以存放八种数据类型通过下标来访问集合特征保存不重复的元素字典特征就是关联数组,以形式存储栈,与队列相似特征存储数 数据结构 常见数据结构 Array 数组是 最简单 而且 应用最广泛 的数据结构 特征: 1、使用连续内存空间来存储 2、存放相同类型或着衍生类型...

    smartlion 评论0 收藏0

发表评论

0条评论

HackerShell

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<