php數組指標探究

來源:互聯網
上載者:User

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

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=338288' scrolling='no'>最近在工作中遇到一個很奇怪的問題,在使用each這個函數對一個數組遍曆之後,再把該數組作為實參傳遞給一個函數,在函數內部再次使用each遍曆形參數組。說明一下,兩次使用each這個函數的目的很簡單,就是將數組中的key轉換成變數名,而key對應的value值轉換成變數的值。其實這個功使用函數extract就能實現。在來接著說說在函數內部使用each函數時出現了什麼問題,在遍曆完之後發現部分變數為NULL,也就是說丟失了部分變數。不知道描述清楚沒有,還是將工作中問題簡化一下,用下面代碼說明一下吧。

<?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).
      按照常規的想法,此時在函數func內部變數 $var1,$var2,$var3,$var4,$var5,$var6 都應該有了,但是事實並非於此,只有變數$var6有值,而其他幾個變數都是NULL。這是為什麼呢?
       問題就出在我們今天要討論的數組指標的問題上。each這個函數會將當前數組指標指向的元素以數組的形式返回,並將數組指標向前移動一位,指向下一個數組 單元。在我們使用each函數將數組 $arr 遍曆完之後,$arr數組的內部指標已經指向了最後一個單元的下一位(沒有任何值)。就在此時我們又 執行了 $arr['var6'] = 6 這個操作,為數組添加了一個新的單元,我們知道,數組在記憶體中儲存肯定都是連續的地址單元。也就是說$arr['var6']的值在記憶體中的位置就應該在 當前數組指標指向的那個單元(之前為空白)。而且給數組賦值是不會移動數組內部指標的,在賦值完成之後,$arr 數組的數組指標就由原來指向一個NULL變成指向一個有實際值存在的地址單元了。
   對於數組作為參數在函數間傳遞時又存在這樣一個規律:我們知道,函數調用時,系統會將實參copy一份賦值給形參(引用調用除外),而對於數組,不僅僅 copy了實參的值,而且還copy了實參數組當前內部指標的位置。如果實參內部指標的位置指向了數組末尾,那麼系統會將形參的內部指標重設,指向形參數 組的第一個單元;如果實參內部指標的位置不在數組末尾,即指向了有效單元,那麼系統會將形參的數組指標位置與實參的數組指標指向值相同的數組單元。

       如果不做 $arr['var6'] = 6 這一步操作,6個變數($var1-$var6)都將有值,因為在each之後,數組指標已經指向了數組的末尾,那麼在調用函數 func()時,系統會重設 $arrtmp的數組指標,將其指向第一個元素。但是在進行  $arr['var6'] = 6這步操作之後,一切就改變了,這一個操作讓$arr的數組指標由原來指向一個NULL變成了一個有效值(說明一下,賦值前後,數組指標指向的地址單元一 直是沒有變化的,只不過是賦值前,那個地址單元什麼也沒有,而賦值之後變成了6)。這就使得$arr的數組指標指向了一個有效單元,那麼在調用函數 func()時,系統是不會重設$arrtmp的數組指標的,$arrtmp的數組指標將會跟$arr的數組指標一樣,指向他自己的最後一個單元。而 each函數又是從當前數組指標的位置開始工作的。因此each函數操作的第一個結果的傳回值就是數組$arrtmp的最後一個元素了,它將數組指標再向下移動一位,while迴圈到此結束,因此$arrtmp['var1']-$arrtmp['var5']都沒有被遍曆到,最終導致$var1-$var6為NULL。
          明天繼續分析數組賦值時,被賦值數組和賦值數組的數組指標的變化情況。
         上面只是我自己目前對數組指標在函數間調用時的一些理解,可能有很多不正確的地方,還望各位大蝦能夠指點迷津!

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

http://biancheng.dnbcw.info/php/338288.html pageNo:8

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.