使用array_walk(和类似函数)之类的函数来修改PHP中的数组> = 5.3

时间:2012-07-23 16:23:11

标签: php arrays pass-by-reference

PHP有一些很棒的函数(比如array_walk),它们允许你处理数组中的每个元素。它们通常是设置的,因此您指定要处理的数组作为第一个参数,并将回调函数指定为每个元素作为第二个参数。这些函数返回指示成功的布尔值,而不是您所期望的修改后的数组的副本。如果要修改数组,则必须通过引用传递数组,如array_walk(&$my_array, 'my_callback');

但是,在PHP 5.3及更高版本中,如果通过引用传递给函数调用,则会出现E_DEPRECATED错误。

有没有人知道(如果存在)一种正确的方法来使用这些函数来修改数组而不会触发错误并且没有明确地抑制它们?是否有更新的替代这些旧的数组处理函数。

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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)
}

答案 2 :(得分:1)

您还可以将回调的参数作为array_walk的第三个参数传递。问题是如何将引用作为回调参数传递。过去在调用array_walk时可以使用&前缀来实现。不推荐使用此方法,随后将其定为非法。使用引用类型的第三个参数定义回调对此无济于事。

一种解决方法可能是在数组内部传递引用(第三个参数允许使用&$ var作为“数组”的参数!),然后在回调中取消引用数组以再次获取引用,如下所示:

function cb(&$v, $k, $ar) {
  $v='bla'.$k;
  $ar[0]++;
}
$count=0;
$arr = array('sint'=>'er','kla'=>'aas','en'=>'zwartepiet');
array_walk($arr,'cb',array(&$count));
var_dump($arr,$count);

哪些印刷品:

array(3) {
  ["sint"]=>
  string(7) "blasint"
  ["kla"]=>
  string(6) "blakla"
  ["en"]=>
  string(5) "blaen"
}
int(3)

当仍然允许呼叫时引用时,以前是这样的:

function cb(&$v, $k, $ref) {
  $v='bla'.$k;
  $ref++;
}
$count=0;
$arr = array('sint'=>'er','kla'=>'aas','en'=>'zwartepiet');
array_walk($arr,'cb',&$count);
var_dump($arr,$count);