来源:http://www.2cto.com/kf/201610/555055.html

在PHP开发过程中,我们都知道在循环的时候,foreach效率比for高,但是为什么foreach效率高呢?其实这是跟PHP变量的数据结构有关。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct _zval_struct zval; 
   
struct _zval_struct { 
    /* Variable information */ 
    zvalue_value value;     /* value */ 
    zend_uint refcount__gc; 
    zend_uchar type;    /* active type */ 
    zend_uchar is_ref__gc; 
}; 
   
typedef union _zvalue_value { 
    long lval;  /* long value */ 
    double dval;    /* double value */ 
    struct { 
        char *val; 
        int len; 
    } str; 
    HashTable *ht;  /* hash table value */ 
    zend_object_value obj; 
} zvalue_value; 

php数组是一个HashTable。HashTable的特点:
键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。哈希冲突(hash collision):哈希函数将两个不同的key映射到同一个索引的情况。

HashTable的数据结构如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct _Bucket 
    char *key; 
    void *value; 
    struct _Bucket *next; 
} Bucket; 
    
typedef struct _HashTable 
    int size; 
    int elem_num; 
    Bucket** buckets; 
} HashTable;

通过这段源码可以看出来,如果是foreach的话,可以直接通过_Bucket里的next获取到下一个值,而如果是for循环,$array['key']这样子获取数据,就会需要做一次hash才会知道bucket的位置,所以foreach比for循环效率更高一些。

HashTable的数据结构

从数据结构角度分析foreach效率比for循环高的原因相关推荐

  1. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

    文章目录 EventBus 中的重要数据类型 1.subscriptionsByEventType 集合 2.typesBySubscriber 集合 EventBus 中的重要数据类型 从几个关键的 ...

  2. 车险赔付率分析报告_机动车辆保险赔付率高的原因分析及对策研究

    机动车辆险赔付率高的原因分析及对策 摘 要: 车险保费收入占财险保费收入比例一直维持在 60% 以上, 是财产保险的一大支柱 险种,但是自 2000 年以来,车险赔付率一直居高不下,其利润贡献度与其保 ...

  3. 车险赔付率分析报告_对车险赔付率高的原因分析

    对车险赔付率高的原因分析 (2012-06-03 23:07:29) 近年来,随着我国机动车社会保有量的迅速增长,机动车辆保险的规模不断发展壮大,车险保费收入在财产险保费收入中占比呈现出越来越高的态势 ...

  4. 【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )

    文章目录 一.问题描述 二.从编译器角度分析该问题 三.数组作为参数的推荐方案 一.问题描述 将 数组 作为 函数参数 , 传递时会 退化为指针 ; 数组的首地址 , 变为指针地址 , 函数中无法判定 ...

  5. 从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发

    有人询问我网上一篇关于"redis为什么单线程这么快"的文章,我建议他不要看了,因为redis是单进程不是单线程,后面的意见不用看了,文章质量肯定不会很好,他也说了自己看了很久源码 ...

  6. java for foreach 效率_Java中LinkedList的fori和foreach效率比较

    在<Java中ArrayList的fori和foreach效率比较>中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较. 1. list ...

  7. Java字节码角度分析多态原理 ——提升硬实力8

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  8. Java字节码角度分析方法调用 ——提升硬实力7

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  9. 从php角度分析预防xss和Sql注入

    引言 从php角度分析预防xss和Sql注入,是因为php对这方面做了很好的支持. XSS 概念: Xss即跨站脚本攻击,指攻击者在网页中嵌入恶意脚本程序(一般由html,css,js组成),当用户打 ...

最新文章

  1. C++——《算法分析与设计》实验报告——贪心算法与回溯法
  2. java list 转 map_Java8 快速实现List转map 、分组、过滤等操作
  3. java 折线图 放大 缩小_可拖拉放大缩小HC折线图 | JShare
  4. redis设置key的有效期
  5. Android动态壁纸画布透明,Android 动态壁纸LayoutParams问题
  6. 整除光棍 (20 分)
  7. JAVA-初步认识-第六章-类与对象的关系(细节)
  8. pyspark分类算法之梯度提升决策树分类器模型GBDT实践【gradientBoostedTreeClassifier】
  9. 通信笑笑点(2010.08.14)
  10. Zoned-Storage - 对ZNS块设备进行基准测试
  11. matlab开方分布上分位点,概率密度分布函数和上分位点的数值计算
  12. Linux平台PPT转图片(Python)
  13. java计算飞机票优惠价格项目
  14. 做一个优秀的开源项目,需要注意哪些方面?
  15. 番茄花园 Ghost XP SP3 2012 06 电脑城极速装机版
  16. STM32系列——手把手教你蓝牙模块HC05、HC06的使用,重在“用起来”(HAL库)
  17. Promise: 手写Promise
  18. Flutter开发模式之Bloc学习
  19. ChatGPT 用户破亿背后...
  20. 淘宝api开放平台SDK调用对接淘宝商品详情

热门文章

  1. mysql导入存储过程报错_mysql导入建立存储过程或函数报错This function has none of DETERMINISTIC, NO SQL解决办法...
  2. 快速创建springboot项目:使用http://start.spring.io/网页创建,使用IDEA的Spring Initializr创建,使用SpringBoot CLI创建
  3. SpringBoot使用JdbcTemplate案例(学习笔记)
  4. Hadoop中通过ToolRunner和Configured实现直接读取命令行动态出入reduce task数量,jar文件等
  5. 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
  6. 5.Boost之“资源申请即初始化” RAII
  7. Common-lang包中StringUtils用法
  8. 为员工长工资。从最低工资调起每人长10%,请计算长工资的人数和长工资后的工资总额,并输出输出长工资人数及工资总额。
  9. Java中调用Oracle中的存储过程的单元测试代码
  10. 7旗舰版装不了itunes_装系统,用小白,让小白来教大家如何用U盘装WIN7系统