PHP數組值問題

來源:互聯網
上載者:User
直接上代碼吧。希望可以得到大神的分析結果。

$test = array(1, 2, 3, 4, 5);foreach ($test as &$value) {    $value = 0;}unset($value);print_r($test);// 結果如下Array(    [0] => 0    [1] => 0    [2] => 0    [3] => 0    [4] => 0)$test = array(1, 2, 3, 4, 5);foreach ((array)$test as &$value) {    $value = 0;}unset($value);print_r($test);// 結果如下Array(    [0] => 1    [1] => 2    [2] => 3    [3] => 4    [4] => 5)

如上代碼所示,僅僅是使用了一下數組強制類型轉換,結果卻是截然不同,我想知道為什嗎?

回複內容:

直接上代碼吧。希望可以得到大神的分析結果。

$test = array(1, 2, 3, 4, 5);foreach ($test as &$value) {    $value = 0;}unset($value);print_r($test);// 結果如下Array(    [0] => 0    [1] => 0    [2] => 0    [3] => 0    [4] => 0)$test = array(1, 2, 3, 4, 5);foreach ((array)$test as &$value) {    $value = 0;}unset($value);print_r($test);// 結果如下Array(    [0] => 1    [1] => 2    [2] => 3    [3] => 4    [4] => 5)

如上代碼所示,僅僅是使用了一下數組強制類型轉換,結果卻是截然不同,我想知道為什嗎?

先看這個例子

$test = array(1, 2, 3, 4, 5);$test1 = $test;foreach ($test1 as &$value) {    $value = 0;}print_r($test);Array(    [0] => 1    [1] => 2    [2] => 3    [3] => 4    [4] => 5)

再看這個例子

$test = array(1, 2, 3, 4, 5);$test1 = &$test;foreach ($test1 as &$value) {    $value = 0;}print_r($test);Array(    [0] => 0    [1] => 0    [2] => 0    [3] => 0    [4] => 0)

上面連個例子都是先賦值,然後再執行foreach,但是第一個是傳值,而第二個是傳引用(地址),傳值相對於對原array 做了一個copy 賦值到新的變數上,他們在記憶體中指向不是同一個地方。

在看你的第二個例子中的 (array)$test, 這個其實相當於建立一個新的array,這個array 和test 肯定不是指向同一個記憶體位址,所以你foreach中的賦值操作並不會修改原來test變數中的值

(array)$test 這本身是一個賦值操作 等於 $a = (array)$test 然後再 foreach $a

數組(Array) 的賦值總是會涉及到值的拷貝。使用引用運算子&通過引用來拷貝數組

php$test = array(1, 2, 3, 4, 5);$test2 = (array)$test;$test2[0] = 0;print_r($test);//[1,2,3,4,5]print_r($test2);//[0,2,3,4,5]

foreach遍曆數組的時候,不加引用他每遍曆一次都會釋放掉value得值,如果加了引用,他不會釋放,而被後來的給覆蓋掉[圖片]要相信我,

兩種代碼我輸出opcode,來針對opcode做討論.
在做foreach(xxx as xx)這類操作的時候,調用的指令是FE_REST來重設數組的迭代器.
從我的紅框裡可以清楚的看到,第一次重設的時候用的是!0,也就是$test,第二次用的是~2,也就是(array)$test.
所以你第一次更改的時候,改變的是$test裡的內容,而第二次更改的時候,改變的是(array)$test這個變數裡的內容,意思就是第二次根本就沒更改到$test

  • 相關文章

    聯繫我們

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