5

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

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

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

4

3 回答 3

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 - 是否可以轻松修复?

于 2012-07-23T16:30:29.613 回答
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);

输出

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
于 2012-07-23T16:28:39.387 回答
1

您还可以将回调的参数作为 array_walk 的第三个参数传递。问题是如何将引用作为回调参数传递。这在调用 array_walk 时使用 & 前缀是可能的。这已被弃用,随后被定为非法。使用引用类型的第三个参数定义回调在这里没有帮助。

一种解决方法是在数组中传递一个引用(&$var 允许作为 'array' 的参数!)作为第三个参数,并在回调中取消引用数组以再次获取引用,如下所示:

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);
于 2020-06-30T21:47:44.050 回答