数组key和value的限制条件

 <?php
$arr = array(
1 => 'a',
"1" => "b",
1.5 => "c",
true => "d"
);
var_dump($arr); $arr = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100
);
var_dump($arr);

运行结果:
array (size=1)
1 => string 'd' (length=1)

array (size=4)
'foo' => string 'bar' (length=3)
'bar' => string 'foo' (length=3)
100 => int -100
-100 => int 100

  • ·key 可以是integer或者string
  • ·value 可以使任意类型。

key会有如下的强制转换:

  • ·包含有合法整形值得字符串会被转换为整型
  • ·浮点数和布尔值也会被转换为整型
  • ·键名null实际会被存储为“”
  • ·数组和对象不能被用为键名
  • ·相同键名,之前会被覆盖

数组内部实现:

  • ·实现数组使用了两个数据结构,一个是HashTable,另一个是bucket。
  • ·HashTable结构体用于保存整个数组需要的基本信息。
  • ·Bucket结构体用于保存具体的数据内容

HashTable是什么?
哈希表,是根据关键字(key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到保重一个位置来访问记录,这加快了查找速度。使得普通的查找和插入、杀出操作都可以在O(1)的时间内完成。这个映射函数称作哈希函数,存放记录的数组称作哈希表。

HashTable结构体的表示:

 typedef struct _hashtable {
uint nTableSize; //hash Bucket的大小,最小为8,以二倍增长
uint nTableMask; //nTableSize-1,索引取值的优化,193491849 & 127
uint nNumOfElements; //hash Bucket中当前存在的元素个数,count()函数会直接返回此值
ulong nNextFreeElement; //下一个数字索引的位置
Bucket *pInternalPointer; //当前遍历的指针,foreach比for快的原因之一,reset,current遍历函数使用
Bucket *pListHead; //存储数组头元素指针
Bucket *pListTail; //存储数组尾元素指针
Bucket **arBuckets; //存储hash数组,实际的存储容器
dtor_func_t pDestructor;
zend_bool persistent;
unsigned char nApplyCount; //标记当前hash bucket被递归访问的次数(防止多次递归)
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;

Bucket结构体:

 typedef struct bucket {
ulong h; //对char *key进行hash后的值,或者使用户指定的数字索引值
uint nKeyLength; //hash关键字的长度,如果数组索引为数字,此值为0
void *pData; //指向value,一般是用户数据的副本,如果是指针数据,则指向pDataPtr
void *pDataPtr; //如果是指针数据,此值会指向真正的value,同时上面pData会指向此值
struct bucket *pListNext; //整个hash表的下一个元素
struct bucket *pListLast; //整个hash表表元素的上一个元素
struct bucket *pNext; //存放在同一个hash Bucket内的下一个元素
struct bucket *pLast; //同一个hash bucket的上一个元素
const char *arKey; //保存当前key所对应的字符串值
} Bucket;

总结成一张图,如下:

php底层源码之数组的更多相关文章

  1. 为什么很多类甚者底层源码要implements Serializable ?

    为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...

  2. List-LinkedList、set集合基础增强底层源码分析

    List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...

  3. List-ArrayList集合基础增强底层源码分析

    List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...

  4. Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap

    声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...

  5. 总结HashSet以及分析部分底层源码

    总结HashSet以及分析部分底层源码 1. HashSet继承的抽象类和实现的接口 继承的抽象类:AbstractSet 实现了Set接口 实现了Cloneable接口 实现了Serializabl ...

  6. LInkedList总结及部分底层源码分析

    LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...

  7. Vector总结及部分底层源码分析

    Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...

  8. Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  9. 从底层源码浅析Mybatis的SqlSessionFactory初始化过程

    目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...

随机推荐

  1. Beta冲刺(2/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11990570.html 作业博客 : https://edu.cnblogs.com/campus/ ...

  2. TynSerial基本数据类型序列(还原)

    TynSerial基本数据类型序列(还原) procedure TForm1.ToolButton17Click(Sender: TObject); var serial: TynSerial; be ...

  3. ArcGIS超级工具SPTOOLS1.7升级说明

    ArcGIS超级工具1.7升级说明:多了:5个工具,总87工具. 5.11   数据打包 44 5.11.1.  mxd批量打包MPK:对一个文件夹所有MXD打包MPK 5.11.2.  mxd文档发 ...

  4. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(控制台)

    参考资料: 控制台下类的形式创建:http://www.cnblogs.com/podolski/p/7406628.html 总结: 一.控制台下类的形式创建 1.新建控制台应用 2.连网执行Nug ...

  5. UML部署图介绍

    https://www.w3cschool.cn/uml_tutorial/uml_tutorial-mi5w28ur.html

  6. 在 Java 应用程序中加一些 Groovy 进来

    如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...

  7. 【转载】 AutoML总结

    原文地址: https://jinxin0924.github.io/2017/12/21/AutoML%E6%80%BB%E7%BB%93/ Posted by JxKing on December ...

  8. Mysql技巧及问题目录

    Mysql技巧及问题目录: MySQL批量导入Excel.txt数据 MySQL批量导入Excel数据

  9. 算法习题---3.12浮点数(UVa11809)

    一:题目 尴尬的非会员水印 二:题目摘要 1.int和float比较 int共32位,可以表示的最大的数为2^32次方 float虽然也是32位,但是是以指数形式保存,指数占8位(含符号),最大127 ...

  10. 【数据库开发】windows环境下通过c++使用redis

    1.Windows下Redis的安装使用 Redis是一个key-value存储系统.Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起 ...