2012-06-12 47 views
1

我一直在通過值傳遞給函數時正在修改數組。按值排列的PHP數組參數,通過引用循環訪問數組項時得到修改

我檢查了代碼,並在函數內部數組循環獲取引用的元素。

我很驚訝地看到循環後數組項被標記爲引用。我不知道這是什麼意思,但必須是我的問題的根源。

讓我舉個例子來看看這一點。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors' , 1); 

$a = array(array(0)); 
echo '--1--';var_dump($a); 
dummy($a); 
echo '--4--';var_dump($a); 

function dummy($arg) { 
    foreach($arg as &$item) { 
     $item[0] = 3; 
    }  
    dummy2($arg); 
echo '--3--';var_dump($arg); 
} 

function dummy2($arg) { 
    foreach($arg as &$item) { 
     $item[1]=9; 
    } 
echo '--2--';var_dump($arg); 
} 
?> 

這段代碼我希望,在3點,$ ARG將只有一個元素之後,但它有兩個,所以它已被dummy2功能修改。

輸出如下:

--1--array(1) { [0]=> array(1) { [0]=> int(0) } } 
--2--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--3--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--4--array(1) { [0]=> array(1) { [0]=> int(0) } } 

爲什麼陣列標記爲&陣列通過引用繞環後? 這怎麼能避免?

回答

2

您需要取消,通過參考捕捉循環變量返回數組:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors' , 1); 

$a = array(array(0)); 
echo '--1--';var_dump($a); 
dummy($a); 
echo '--4--';var_dump($a); 

function dummy($arg) { 
    foreach($arg as &$item) { 
     $item[0] = 3; 
    } 
    unset($item); 
    dummy2($arg); 
echo '--3--';var_dump($arg); 
} 

function dummy2($arg) { 
    foreach($arg as &$item) { 
     $item[1]=9; 
    } 
    unset($item); 
echo '--2--';var_dump($arg); 
} 
?> 

看到documentation for foreach,有一個很大的紅色警告說:

甚至在foreach循環後仍保留$ value和最後一個數組元素的引用。建議通過unset()銷燬它。

0

使用key => value對並在功能

<?php 

    error_reporting(E_ALL); 
    ini_set('display_errors' , 1); 

    $a = array(array(0)); 

    echo '--1--';var_dump($a); 

    $a = dummy($a); 

    echo '--4--';var_dump($a); 

    function dummy($arg) { 

     foreach($arg as $key => $value) { 

      $arg[$key][0] = 3; 
     } 

     return dummy2($arg); 
    } 

    function dummy2($arg) { 

     foreach($arg as $key => $value) { 

      $arg[$key][1]=9; 
     } 

     return $arg; 
    } 
?> 

http://codepad.org/f30c6FUj