2013-05-15 18 views
5

私は先進的な試験のためにPHPを勉強しています。実践テストでは、最初の反復は2番目の反復よりも優れていると言いました。なぜ私は理解していない。それらは両方とも配列の内容をちょうどうまく反復処理します。これら2つの配列の反復の違いは何ですか?

//まず1:

foreach($array as $key => &$val) { /* ... */ } 

// 2つ目:

foreach($array as $key => $val) { /* ... */ } 
+0

ええ、人をもっと混乱させる傾向があります:http://stackoverflow.com/questions/6287970/php-foreach-statement-by-reference-unexpected-behaviour-when-reusing-iterator –

+0

[this ](http://stackoverflow.com/questions/10057671/how-foreach-actually-works)。 – BlitZ

+3

どのような試験をしますか?私はこれがZCEから来たとは信じられません –

答えて

10

模擬試験は、最初の反復が第二よりも優れていると述べました。

これは最良のアドバイスではありません。彼らはさまざまな仕事のための異なるツールです。

&は、コピーとは対照的に、変数を変数として扱うことを意味します。

変数参照がある場合は、Cのポインタと似ています。変数にアクセスすると、元の変数のメモリ位置にアクセスできるようになり、別の識別子で値を変更できるようになります。

// Some variable. 
$a = 42; 

// A reference to $a. 
// & operator returns a reference. 
$ref = &$a; 

// Assignment of $ref. 
$ref = "fourty-two"; 

// $a itself has changed, through 
// the reference $ref. 
var_dump($a); // "fourty-two" 

CodePadの参考例。

foreachの通常の動作は、関連するブロックでコピーを使用できるようにすることです。これは自由に割り当てを変更できることを意味し、配列メンバーには影響しません(クラスインスタンスなどの常に参照する変数の場合はそうではありません)。

CodePadのコピー例。

CodePadのクラスインスタンスの例。 foreach内の参照を使用

は偶然後修飾および配列に影響を与えることができ、このような反復処理の最後の値にダングリング$val参照として、いくつかの副作用を有します。

CodePadのぶら下がり参考例。 $valに変更が$arrayに保存されます> -

+0

ありがとう助けを求めて! 「コピーとは対照的に」ということについてもう少し言っていただけますか?私の唯一の理解は、$ Foo2 = &$Foo1; – Willow

+0

@ Willowのような変数を書くことになります。今後の編集を参照してください。 – alex

+0

私は参照してください。だから私は&私は$ valを呼び出すことによってforeachループの外で配列を編集することができますか?どうもありがとう!あなたはこれを明確にする上で素晴らしい仕事をしました。 – Willow

1

最初の例は、$valため&参照演算子を含みます。

これは例#2よりも "良い"ものではありません。

関連する問題