21

違いは何ですか

foreach ($my_array as $my_value) {
}

と:

foreach ($my_array as &$my_value) {
}

?

1 つをいつ使用し、もう 1 つをいつ使用するかの実例を 2 つ教えてください。

4

5 に答える 5

30

最初の例では値のコピーを作成しますが、2 番目の例では元の値への参照を使用します。したがって、最初のforeach実行後、元の配列はまだ変更されていません。2 番目以降はforeach、元の配列が参照によって処理されたため、変更された可能性があります。

shuffle()配列の内容を再配置するなど、一部のネイティブ PHP 関数は既にこの方法で動作しています。この関数は配列を返さないことに気付くでしょう。呼び出すだけです。

$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled

また、配列のコピーを作成するのではなく、参照によって配列を操作するため、魔法のように機能します。

次に、参照によって何も渡さず、元の値のコピーを処理する関数があります。たとえばucwords()、新しい結果の文字列を返します。

$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized

参照渡しを参照してください。

于 2010-12-29T15:18:14.150 に答える
7

ジョナサンの答えはそれを非常によく説明しています。完全を期すために、2 つの例を次に示します。

  1. 値を読むだけです:

    $my_array = range(0,3);
    foreach ($my_array as $my_value) {
        echo $my_value . PHP_EOL;
    }
    
  2. 各要素にいくつかの数値を追加します (したがって、各値を変更します):

    foreach ($my_array as &$my_value) {
        $my_value += 42;
    }
    

    を使用しない場合&$my_value、追加は に影響しません$my_array。しかし、参照を使わずに同じことを書くことができます:

    foreach($my_array as $key=>$value) {
        $my_array[$key] = $value + 42;
    }
    

    違いは、元の値に直接アクセス/変更していること$my_array[$key]です。

デモ

于 2010-12-29T15:28:34.073 に答える
0

変数の前にアンパサンドを付けると、「参照」が作成されます。PHP 参照は、コンピューター上のショートカットまたはシンボリック リンクのようなものです。同じデータの単なる別の名前であるポインター変数を作成できます。

メモリを節約する変数をコピーしないことを除いて、これらを使用することに大きな違いはありません。変数を渡すときは、参照と参照ポイントを元のオブジェクトに渡すだけです。

于 2010-12-29T15:32:52.447 に答える
0

& の実際の使用例は、非常に少ないコード行で配列の内容を変更する必要がある場合です。

foreach($arrFeed as &$objFeed)
  $objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);
于 2011-02-11T17:46:33.847 に答える