php數組指標探究二

來源:互聯網
上載者:User

簡介:這是php數組指標探究二的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=338285' scrolling='no'>在“php數組指標探究”中我們討論了數組作為參數在函數調用時,實參和形參各自數組指標的變化情況。現在我們再來談論一下數組在賦值的過程中,賦值數組和被賦值數組各自數組指標的變化情況。
先給出一條結論,然後我們在用代碼來證明這個結論吧。$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的數組指標指向的元素。
通過demo1和demo2就可以證明上述結論了。

 因此為了在遍曆數組時不受數組指標的影響,最好在使用each()函數之前或者之後調用函數reset()將數組指標重設。這樣就可以避免上述問題的發生了。另外還有一個運算元組指標的函數prev(),它的作用是將數組指標當前的位置後退一位,它也需要注意一點,就是如果數組指標已經指向數組末尾,那麼使它就得不到想要的結果了。

順便說一下foreach這個函數,使用foreach函數來遍曆數組時,它會重設數組指標,將其指向數組的第一個元素。必須注意的是foreach操作的對象是對你要遍曆的數組的copy值,而不是遍曆數組本身。

上述對數組指標的理解僅是一家之言,還望各位在留下腳印的同時,不要忘記批評指正。

愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具

http://biancheng.dnbcw.info/php/338285.html pageNo:9

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.