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

Ray*_*Ray 5 php arrays pass-by-reference

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

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

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

Jas*_*ary 7

由函数定义确定的值在PHP> = 5.3中隐式传递值.

功能定义array_walk():

bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
Run Code Online (Sandbox Code Playgroud)

注意&$array.因此,您不需要在PHP> = 5.3中的函数调用中通过引用显式传递数组.

array_walk($my_array, 'my_callback');
Run Code Online (Sandbox Code Playgroud)

但是,您需要确保回调相应地通过引用接受它的值(如nickb所示).

另请参阅PHP 5.4 Call-time pass-by-reference - Easy fix available?


nic*_*ckb 6

因为您应该定义回调以通过引用接受其参数来修改数组.

array_walk( $my_array, function( &$el, $key) { $el = $el / 2; });
Run Code Online (Sandbox Code Playgroud)

所以这是一个快速的例子:

$my_array = range( 2, 10, 2);
array_walk( $my_array, function( &$el, $key) { $el = $el / 2; });
var_dump( $my_array);
Run Code Online (Sandbox Code Playgroud)

输出:

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
Run Code Online (Sandbox Code Playgroud)