数组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. git前期准备

    git小结 设置用户名 git config –global user.name 'itcast' 设置用户名邮箱 git config –global user.email 'itcast' 查看设 ...

  2. [插件式开发][C#]

    Demo 下载 参考文章:https://www.cnblogs.com/hippieZhou/p/9398354.html 技术方面要使用到 依赖注入,可以参考此示例逐步学习:https://git ...

  3. A filter or servlet of the current chain does not support asynchronous operations. 错误解决记录

    做视频文件上传一直报这个错误: java.lang.IllegalStateException: A filter or servlet of the current chain does not s ...

  4. Angular 执行 css3 简单的动画

    <div class="content"> 内容区域 <button (click)="showAside()">弹出侧边栏</b ...

  5. angular 中*ngIf 和*ngSwitch判断语句

    <div style="text-align:center"> <h1> Welcome to {{ title }}! </h1> <p ...

  6. 【转载】 什么是P问题、NP问题和NPC问题

    原文地址: http://www.matrix67.com/blog/archives/105 转载地址: https://www.cnblogs.com/marsggbo/p/9360324.htm ...

  7. win7电脑删除保存的凭据

    win7电脑删除保存的凭据: 控制面板-> 用户账户 -> 管理您的凭据

  8. EOF使用

    1.cat向文件覆盖内容 cat > local.repo << EOF [local]name=localbaseurl=file:///mnt/cdromgpgcheck=0en ...

  9. dede织梦5.7的安全防护设置

    dede安全是一直令人堪忧的,但是其用来建网站很方便,如果我们使用dede来建站,一定要做好安全防护工作. 下面总结一下dede织梦5.7的安全防护设置 1.更改管理员名称和密码,尽可能设置的复杂一下 ...

  10. sql 索引【转】

    T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他   简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...