違いは何ですか
foreach ($my_array as $my_value) {
}
と:
foreach ($my_array as &$my_value) {
}
?
1 つをいつ使用し、もう 1 つをいつ使用するかの実例を 2 つ教えてください。
最初の例では値のコピーを作成しますが、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
参照渡しを参照してください。
ジョナサンの答えはそれを非常によく説明しています。完全を期すために、2 つの例を次に示します。
値を読むだけです:
$my_array = range(0,3);
foreach ($my_array as $my_value) {
echo $my_value . PHP_EOL;
}
各要素にいくつかの数値を追加します (したがって、各値を変更します):
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]
です。
変数の前にアンパサンドを付けると、「参照」が作成されます。PHP 参照は、コンピューター上のショートカットまたはシンボリック リンクのようなものです。同じデータの単なる別の名前であるポインター変数を作成できます。
メモリを節約する変数をコピーしないことを除いて、これらを使用することに大きな違いはありません。変数を渡すときは、参照と参照ポイントを元のオブジェクトに渡すだけです。
& の実際の使用例は、非常に少ないコード行で配列の内容を変更する必要がある場合です。
foreach($arrFeed as &$objFeed)
$objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);