5

PHP には、配列内の各要素を処理できる優れた関数 (array_walk など) がいくつかあります。これらは通常、処理する配列を最初のパラメーターとして指定し、各要素に適用するコールバック関数を 2 番目のパラメーターとして指定するように設定されています。これらの関数は、期待どおりに変更された配列のコピーではなく、成功を示すブール値を返します。配列を変更したい場合は、次のように参照によって配列を渡す必要があります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 - Easy fix available? もご覧ください

于 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 の 3 番目のパラメーターとして、コールバックの引数を渡すこともできます。問題は、参照をコールバック引数として渡す方法です。これは、array_walk を呼び出すときに & プレフィックスを使用することで可能でした。これは推奨されておらず、その後違法とされています。参照型の 3 番目のパラメーターを使用してコールバックを定義しても、ここでは役に立ちません。

回避策として、配列内の参照を 3 番目の引数として渡し (&$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 に答える