关于PHP数组你应该知道的事情
(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 的顺序也都一致时,这两个关联数组才严格相等。