PHP内核探索之变量(4)- 数组操作
上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用的函数系列-数组操作的相关函数做进一步的跟踪。
本文主要内容:
- PHP中提供的数组操作函数
- 数组操作函数的实现
- 结语参考文献
一、PHP中提供的数组操作函数
可以说,数组是PHP中使用最广泛的数据结构之一,正因如此,PHP为开发者提供了丰富的数组操作函数(参见http://cn2.php.net/manual/en/ref.array.php ), 大约有80个,这对于绝大多数的数组操作而言,已经足够了。如果按照数组操作的类别来分,这些函数大致可以分为如下几类(不完全分类):
- 数组遍历相关函数:如prev, next, current, end,reset, each等
- 数组排序相关:如sort, rsort, asort, arsort, ksort, krsort, uasort, uksort
- 数组查找相关: 如in_array, array_search, array_key_exists等
- 数组分割、合并相关: array_slice, array_splice, implode, array_chunk, array_combine等
- 数组交并差:如array_merge, array_diff, array_diff_*, array_intersect, array_intersect_*
- 作为stack/queue容器的数组: 如array_push, array_pop, array_shift
- 其他的数组操作:array_fill, array_flip, array_sum, array_reverse等
PHP中,数组相关的操作有如下特点:
- 数组操作函数是通过扩展的形式(ext/standard/array.c)提供的,因此也会经历扩展的MINIT, RINIT, RSHUTDOWN, MSHUTDOWN等过程。
- 在底层,定义PHP函数的方式是PHP_FUNCTION(function_name),例如数组操作函数array_merge在底层是PHP_FUNCTION(array_merge)
- 由于数组的底层实现是HashTable,因而数组的绝大多数操作实际上都是针对HashTable的操作,这是通过HashTable API实现的。
接下来,我们以几个具体的函数为例,深入探索PHP中数组函数的实现。
二、数组操作的实现
由于数组的操作实际上是对HashTable的相关操作,因而,我们再次贴出HashTable的结构和结构图,以便参考。
HashTable的结构:
typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; /* Used for element traversal */ Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection; #if ZEND_DEBUG int inconsistent; #endif } HashTable;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP写爬虫
- 下一篇: 深入php内核,从底层c语言剖析php实现原理
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2