PHP foreach 引用
<pre class="php" name="code"><?php $a = array( 'str1' => 'val1', 'str2' => 'val2', 'str3' => 'val3', 'str4' => 'val4', ); $b = array( 'str1', 'str2', 'str3', 'str4', ); foreach ($b as &$val) { $val = $a[$val]; } unset($val); foreach ($b as $val) { echo "-----$b[3]"; echo $val."\n"; } ?>
出力:
-----val1val1
-----val2val2
-----val3val3
-----val3val3
最初の foreach の最後の $[2] 参照が閉じられていないため、アドレスがすでに 2 番目の foreach に継続的に書き込まれていることがわかります。
これは、$b[2] の値を出力することで確認できます。 foreach が実行されると、$b[2] の値は常に変化します。この結果、foreach が $b[1] に対して実行されると、$b[2] の値は
になります。
$b[1] と等しい場合、最後の実行では、$b[2] = $b[2] は、結果が $b[1] と同じであることを意味します
解決策:
unset () メソッドを使用して参照変数を解放し、2 番目の foreach ループを実行します。
<pre class="php" name="code"><?php $a = array( 'str1' => 'val1', 'str2' => 'val2', 'str3' => 'val3', 'str4' => 'val4', ); $b = array( 'str1', 'str2', 'str3', 'str4', ); foreach ($b as &$val) { $val = $a[$val]; } unset($val); foreach ($b as $val) { echo "-----$b[3]"; echo $val."\n"; } ?>
出力結果:
-----val4val1
-----val4val2
-----val4val3
-----val4val4
オプション 2 (あまり良くありません):
<?php $a = array( 'str1' => 'val1', 'str2' => 'val2', 'str3' => 'val3', 'str4' => 'val4', ); $b = array( 'str1', 'str2', 'str3', 'str4', ); foreach ($b as &$val) { $val = $a[$val]; } // unset($val); foreach ($b as $item) { echo "-----$b[3]"; echo $item."\n"; } ?>
2 番目の foreach のように変数を置き換え、参照された変数を使用しない場合、この状況は発生しません。
出力:
-----val4val1
-----val4val2
-----val4val3
-----val4val4
まとめ: 参照後は unset() を使用して解放することを推奨します。