(1)、PHP数组的遍历顺序

先举个栗子:

<?php

	$arr['a'] = '123';
$arr['b'] = '456';
$arr['c'] = '789'; foreach($a as $val){
var_dump($val);
}

这段代码的输出,显然会得到如下的结果:

那么,如果是如下的代码呢?

<?php

	$arr[2] = '123';
$arr[1] = '456';
$arr[0] = '789'; foreach($a as $val){
var_dump($val);
}

这两段代码不同之处是一个数组为关联数组,另外一个数组为索引数组,那么它们的输出结果会是一样的么,答案是一样的,第二段代码输出也会得到跟第一段代码相同的结果。

那么,这是为什么呢?

原因就在于PHP的数组实现是一个大的HashTable,增加元素的时候, 元素会插在相同Hash元素链的头部和线性列表的尾部. 也就是说, 元素在线性遍历的时候是根据插入的先后顺序来遍历的, 这个特殊的设计使得在PHP中,当使用数字索引时, 元素的先后顺序是由添加的顺序决定的,而不是索引顺序.也就是说, PHP中遍历数组的顺序, 是和元素的添加先后相关的。

详细的解释,请参考鸟哥的  深入理解PHP之数组(遍历顺序)

(2)、什么样的两个关联数组会严格相等

我们来看如下代码:

<?php

	$a = array('1' => 'a','2' => 'b');
$b = array('2' => 'b','1' => 'a');
$c = array('1' => 'a','2' => 'b'); $flag_a_equal_b = ($a == $b);
$flag_a_strict_equal_b = ($a === $b);
$flag_a_strict_equal_c = ($a === $c); var_dump($flag_a_equal_b);
var_dump($flag_a_strict_equal_b);
var_dump($flag_a_strict_equal_c);

运行这段代码会得到如下的结果:

也就是说,在PHP中,只要两个关联数组的所有的 key,对应的value都是一致的,那么这两个关联数组就是相等的。但是,只有当两个关联数组的所有 key 的顺序也都一致时,这两个关联数组才严格相等。

关于PHP数组你应该知道的事情的更多相关文章

  1. PHP内核探索:数组与链表

    在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢? 我们在选择各种数据结构 ...

  2. 【学习】基础知识:数组和矢量计量【Numpy】

    Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...

  3. python数据分析---第04章 NumPy基础:数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  4. python数据分析 Numpy基础 数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  5. 谈谈iOS app的线上性能监测

    在移动端开发者中最重要的KPI应该是崩溃率.当崩溃率稳定下来后,工作的重心就应该转移到性能优化上.那么问题来了,如果你的项目也没有接入任何性能监测SDK,没有量化的指标来衡量,那你说你优化了性能领导信 ...

  6. php引用计数的基本知识

    每个php变量存在一个叫"zval"的变量容器中.一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息.第一个是"is_ref",是个bool ...

  7. python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

  8. hdu 1069 Monkey and Banana

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. 用标准C编写COM(一)

    cdllbufferstruct编译器微软 目录(?)[-] 简介 COM对象和虚表 GUID QueryInterfaceAddRef and Release IClassFactory对象 打包到 ...

随机推荐

  1. FastReport打印table

    经过验证是对的. table第一行添加标题,也就是拖过来的文本label,第二行开始绑定数据源的字段. 先设计报表的静态部分,再用代码注册数据源,然后设计,添加注册的数据源,绑定字段. var rep ...

  2. 六、mybatis分页插件集成

    本文基于上一篇“集成mybatis”内容 1.添加依赖 <!-- mybatis-pageHelper --> <dependency> <groupId>com. ...

  3. OOP 第一章作业总结

    程序设计结构分析 类图分析 第一次作业 由于第一次作业完成的功能比较简单,而且出于对面向对象设计理念不熟悉(其实现在也不是很熟悉,逃),整个程序设计的非常简单.通过类图(见下)可以看出,程序只有两个类 ...

  4. javaEE Design Patter(2)详解3个设计模式

    Factory (bean creating) Proxy(Agent)(Aop)书有~ Templete(springMVC Facelets)//此处及以上忽略 工厂模式(Factory) 工厂模 ...

  5. MyBaits_查询缓存02_Ehcache二级缓存

    一.Ehcache二级缓存的开启 导入jar(https://github.com/mybatis/ehcache-cache/releases) <cache type="org.m ...

  6. thinkphp传送文章id值

  7. js-原始类型和声明变量

    ** Java的基本数据类型:byte.short.int.long.float.double.char.boolean ** 定义变量 都是用关键字 var(ES6中可以使用const和let来定义 ...

  8. StringBuffer总结分析

    构造方法 /** * Constructs a string buffer with no characters in it and an * initial capacity of 16 chara ...

  9. 洛谷P3953 逛公园(dp 拓扑排序)

    题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...

  10. Visual C++编程实现摄像头视频捕捉

    原文:http://blog.csdn.net/nemojiang/article/details/653033?locationNum=7&fps=1 前言 DirectShow是微软公司提 ...