1

関数パラメーターを変更する必要がある場合は、使用できfoo(&$x)、関数はそれを変更できます。foreach ループでこのようなものが必要です。

 $x=array(1,2,3);
 foreach($x as &$i) $i=1;
 var_dump($x);

奇妙な "&int(1)" という結果になります...

 array(3) {
   [0]=>
   int(1)
   [1]=>
   int(1)
   [2]=>
   &int(1)
 }

しかし、もちろん、これは構文ではありません (私が望んでいる)... PHP でこれを行うことは可能ですか?


使用するのは「とてもエレガント」ではありませんfor(今では機能します!)、

 $x=array(1,2,3);
 for($i=0; $i<count($x); $i++) $x[$i]=1;
 var_dump($x);
4

3 に答える 3

1

まず、これは技術的にはポインターではありません。参考です。コードでそれらを使用する前に、それらを説明するマニュアル セクションを読んで、PHP での動作に慣れることをお勧めします。

この場合、のマニュアル ページに記載されているように、コードは実際には正しいものですforeachforeach($x as &$i)まさにこれを行う方法です。あなたの混乱は明らかに次の出力から来ていますvar_dump

&int(1)

これはまさにあなたが期待すべきことです。は、別の変数がこの&値を指す参照であることを示します。これは$i、ループが終了した後も、配列内の最後の要素への参照が引き続き行われるためです。これは潜在的に危険です。ファイルの他の場所のコードが変更される可能性が$iあり、その結果、意図せずに配列が変更される可能性があるためです。

これunset $iを回避するには、ループが終了した後に実行することをお勧めします。

于 2013-06-24T17:06:55.473 に答える
0

ループが終了しても、反復子は最後に使用された値を保持しています。この場合、配列の最後の項目です。だから今でも参考にしています。後で再利用しようとしない限り、実際には問題にはなりません$i。その場合、奇妙な結果が得られる可能性があります。

次のようにする方が安全です。

foreach($x as $k=>$v) {
    $x[$k] = 1;
}
于 2013-06-24T17:02:03.747 に答える
0

良いコメントの後の宿題とコメントへの回答。

ガイドを読む

@lonesomeday が言うように、「それはまさに正しい構文です」。PHPガイドはそれを示しています

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value)
    $value = $value * 2;
unset($value); // break the reference with the last element

そして、@Wrikkenが言うように、unset.

よくわからない場合は「中間エレガンス」を使用してください

@ MarcB20が言うように、気をつけて...」foreach($x as &$i) $i=1;は非常に危険です。 $iコードの実行中(または設定を解除するまで)参照が残り、他の変数で変数を再利用することで、無意識のうちに配列の内容を変更できます今後のコンテキスト」...

したがって、「中間エレガンス」構文を使用できます。

foreach ($arr as $key=>$value) {
    // ... use $value ...
    $arr[$key] = $anothervalue;
}

$value が使用されていない場合は、シンプルfor(連想配列の場合) を使用することを好みます。array_keys

于 2013-06-24T17:15:34.960 に答える