2017-11-10 4 views
1

参照によって渡すことによって直接配列の値を変更(大文字に変換)するコードスニペットを検討してください。なぜ一時変数は配列要素を変更する必要があり、なぜそれを最後に設定解除する必要があるのですか?

<?php 
    $colors = array('red', 'blue', 'green', 'yellow'); 

    foreach ($colors as &$color) { 
    $color = strtoupper($color); 
    } 
    unset($color); /* ensure that following writes to 
    $color will not modify the last array element */ 

    print_r($colors); 

?> 

出力:

Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => YELLOW 
) 

私はすべて上記のコードを理解していませんでした。次のように私は上記のコードに関するいくつかの疑問をしました:

  1. 私はforeachループ内からすべての$color = strtoupper($color);でこの文を理解していませんでした。なぜ一時変数$colorが使用され、関数strtoupper()に参照&$colorが渡されず、$colorしか渡されないのはなぜですか?
  2. なぜ変数$colorが設定されていないのですか?設定を解除する前に何が入っていましたか?
  3. コメントの意味は配列から最後の要素として「次が最後の配列要素を変更しません $色に書き込みことを確認してください」、すなわち黄色もをどのように修正なっているのですか?要するに

ステップバイステップのようにしてそこforeachループからのコードで何が起こっているのか私に説明してください。

誰かが私の疑問に答えてください。

注:上記のコード例は、PHP Manualの「Array」の章にあります。

+0

/削除、 'unset'コールをコメント' $のcolor'変数に書き込みを追加最後の 'print_r'コールの前に)あなたはすぐにそれを得るでしょう。 – Calimero

+0

ここでunset()をコメント/削除して、実際に起こっている魔法を見てみましょう。答えが出てくる。 – Calimero

+1

補助として、あなたはarray_map:$ colors = array_map( "strtoupper"、$ colors); –

答えて

0

ここは職場での防衛プログラミングです。

foreach()ループの各繰り返しで、現在の項目値への参照が$color変数に作成され、新しい値を書き込むことができます。しかし、反復が終了すると、$color変数には最後の配列項目の値への参照が含まれているため、プログラマは配列の項目を更新するために変数$colorを再利用することができます。 unset()ループが参照を破棄し、そのリスクを回避した後に変数を変更します。あなたの例の上

ビル:

<?php 
$colors = array('red', 'blue', 'green', 'yellow'); 

foreach ($colors as &$color) { 
    $color = strtoupper($color); 
} 
//unset($color); 
/* ensure that following writes to 
$color will not modify the last array element */ 

print_r($colors); 
$color='hello'; 
print_r($colors); 

出力:

Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => YELLOW 
) 
Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => hello 
) 

https://eval.in/897010

関連する問題