先給出一條結論,然后我們在用代碼來證明這個結論吧,$arrtmp=$arr;在這個賦值表達式中我把$arr叫做賦值數組,把$arrtmp叫做被賦值數組,數組在賦值時,如果賦值數組的數組指針已經指向了數組末尾,則賦值之后賦值數組的數組指針會被重置,指向數組第一個元素,如果在賦值時,賦值數組的數組指針沒有指向數組末尾,而是指向了任何一個有效的數組元素,那么在賦值之后賦值數組的數組指針是不會被重置的,而是保留其原來指向的元素.
在賦值之后,被賦值數組不僅有了賦值數組的值,而且賦值數組的數組指針指向了那個元素,被賦值的數組也會指向自己中值相同的那個元素.
demo1實例代碼如下:
- <?php
- $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
- while( list($key,$value) = each($arr) )
- {
- if($value == 4) break;
- }
- var_dump(current($arr));
- $arr1 = $arr;
- var_dump(current($arr));
- var_dump(current($arr1));
- ?>
demo1 的執行結果是:int(5) int(5) int(5),從這個結果可以看出,賦值前后$arr的數組指針位置沒有發生任何變化,$arr1不僅值跟$arr相同,而且數組指針所指向的元素值也是相同的。現在 用上述結論來解釋這個結果,在while循環中,有一個if判斷語句,目的是不讓$arr的數組指針指向數組末尾,而是保留在一個有效的位置,在$value=4時會跳出循環,而each這個函數會將數組指針向前移動一位,這就導致了$arr的數組指針指向了第5個元素,所以在賦值之 前,current($arr)的結果是5,賦值之后,由于在賦值之前$arr的當前指針并沒有指向末尾,因此在賦值之后不會將$arr的數組指針進行重置,而是保留了其原有的位置,因此在賦值之后使用current($arr)的結果仍然是5,賦值時$arr1不僅獲得了$arr的值,而且數組指針指向的元素和$arr的相同,二者都是5.
demo2實例代碼如下:
- <?php
- $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
- while( list($key,$value) = each($arr) )
- {
- //if($value == 4) break;
- }
- var_dump(current($arr));
- $arr1 = $arr;
- var_dump(current($arr));
- var_dump(current($arr1));
- ?>
demo2中我們將 if($value == 4) break; 這一句注釋掉了,目的很簡單,就是通過each將$arr的數組指針位置指向數組末尾.
demo2 的執行結果:bool(false) int(1) bool(false),如果數組指針對應的元素為0,“”,或者不是一個有效的值時,current函數會返回false,$arr的值中沒有為0或者“”的情況,因此可以斷定是因為數組指針指向了一個無效的元素而導致current返回了一個false。
換句話說就是可以確定在while循環完成之后,$arr的數組指針已經指向了數組的末尾。所以我們看到在賦值之前current($arr)的值是false,而賦值之后current($arr)的值變成了1,說明賦值 之后$arr的數組指針被重置了,指向了數組的第一個元素.current($arr1)的值為false,說明賦值之后$arr1讓然保留了賦值之 前$arr的數組指針指向的元素.
不知道描述清楚沒有,還是將工作中問題簡化一下,用下面代碼說明一下吧.
- <?php
- $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
- while( list($key,$value) = each($arr) )
- {
- $$key = $value;
- }
- //下面這一步操作很關鍵,問題就出在這里,遍歷完之后,對數組添加一個值。
- $arr['var6'] = 6;
- func($arr);
- function func($arrtmp)
- {
- while(list($key,$value) = each($arrtmp) )
- {
- $$key = $value;
- }
- var_dump($var1);
- var_dump($var2);
- var_dump($var3);
- var_dump($var4);
- var_dump($var5);
- var_dump($var6);
- }
- ?>
- //輸出結果:NULL NULL NULL NULL NULL int(6).
新聞熱點
疑難解答