1. 复制一个数组,就是把一个数组赋值给一个变量便可。会把数组指针位置一同复制。这里面有两种情况。一,指针位置合法,这时直接复制,无影响。二,原数组指针位置非法时,“新”数组指针会初始化。(这里的新字为什么要加引号?请看下文)先看例子:
出现这种情况好像不对?$arr2 难道不是新数组?新数组的数组指针应该重置了啊。这里应该注意了。这涉及到 php 内部优化原理。这里 $arr2 = $arr1 ,在俩变量都没发生写操作时,他们其实引用的是同一个内存单元,即引用赋值。在其中一个变量发生写操作后,内存单元会复制一份,发生改变的变量会去引用它,并把数组指针初始化。这里 current() 函数发生一个写操作,所以 $arr1 会去引用复制的内存单元,并且指针初始化。
这个php内部优化是对值传递的优化。如果是一个变量,那不用讨论,因为涉及了数组指针,容易出错,所以讨论。注意数组值传递操作后,数组指针的变化便可。
2. 关于 php 数组指针的几个函数:
current() 获得当前指针所在元素的值。
key() 获得当前的键。
next() 指针后移一位。
prev() 指针前移一位。
reset() 指针重置到第一位。
end() 指针移动到最后一位。
3. foreach 的执行流程。它遍历的其实是一个数组的拷贝。在循环体中对数组赋值,其实是对原数组的改变,不会影响到当前被遍历的数组。
4. 在 foreach( $arr as $k => & $v) 中 $v 可以是引用传递。这时的 $v 的值会影响到原数组的值。$k 不可以是引用传递。
5. count() 计算数组长度。第二个参数为 true 时,统计多维数组长度。注意多维数组的长度。
6. 真正的遍历数组是先获得数组元素,然后获得键与值。而不是先获得键,然后获得值,这不是遍历。
7. foreach 会先把指针初始化,然后给键和值变量赋值,之后移动指针,最后执行程序体。
8. each 包含 key,current,next 三个功能。返回一个索引数组和关联数组的集合数组。