2012-07-23 66 views
5

PHP有一些很棒的函數(如array_walk),它們允許您處理數組中的每個元素。它們通常會被設置,因此您可以將要處理的數組指定爲第一個參數,並將回調函數作爲第二個參數應用於每個元素。這些函數返回表示成功的布爾值,而不是您所期望的修改數組的副本。如果你想在數組修改,你必須通過引用像array_walk(&$my_array, 'my_callback');使用類似array_walk(和類似函數)的函數修改PHP中的數組>> 5.3

傳遞數組。然而,在PHP 5.3及以上版本,如果你通過參考函數調用你會得到一個錯誤E_DEPRECATED。

有誰知道(如果存在)一個正確的方式來使用這些函數修改數組而不觸發錯誤,並沒有明確禁止它們?這些舊的數組處理函數是否有更新的替代方案?

回答

7

值由隱含在PHP> = 5.3由函數定義確定引用傳遞。

array_walk()函數定義:

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

&$array。因此,您不需要在PHP> = 5.3的函數調用中通過引用顯式傳遞數組。

array_walk($my_array, 'my_callback'); 

但是,你需要確保回調接受它的引用值相應(由nickb作爲證明)。

而且看看PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

啊......謝謝,有道理。有趣的細微差別 - 你不能通過引用來調用,但是你可以用引用的參數定義一個函數/方法。 http://php.net/manual/en/language.references.pass.php我仍然希望這些函數返回修改數組的副本或null而不是布爾值! – Ray 2012-07-23 16:39:14

+0

是的,確切地說。很高興幫助。 – 2012-07-23 16:58:59

6

因爲您應該定義回調以通過引用來接受其參數來修改數組。

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

所以一個簡單的例子是這樣的:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

威爾output

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

感謝您的反饋,但JASONS回答以下這些添加到您的提法問題更加清晰。儘管如此,你仍然得到了讚賞! – Ray 2012-07-23 16:39:50

+0

+1以及我的例子。 – 2012-07-23 16:56:24