2

配列内の値を表示している次のコードは、単純な for ループを使用した場合とは対照的に、foreach() でラップした場合に異なる結果を示しています。for ループは正しいデータを表示していますが、foreach() は反復ごとに入力配列を修正しているように見えます。

$arr = array_merge($arr1, $arr2);

for ($x = 0; $x < count($arr); $x++) {
    echo $arr[90]['circread_value'];
}

foreach ($arr as $unused) {
    echo $arr[90]['circread_value'];
}

for ループからの出力は、(予想どおり) 何度も同じ値になります。

1382429.00
1382429.00
1382429.00
1382429.00
...

foreach() からの出力は、配列の 91 番目の要素が反復ごとに変化していることを示しています。

56256.00
45652.00
50726.00
317896.00
...

どうすればいいの?

注: 上記のコードが不自然であることはわかっています (明らかに foreach() 内で、91 番目の要素を見るだけでなく、実際にはさらに処理を行い、繰り返し処理している配列の各要素を参照したいと考えています)。コードを単純なものに単純に戻しました(私のデバッグの一環として、ここに投稿するのと同じくらい!)

詳細情報:

  • $arr は、2 つの 91 要素の配列を array_merge して 182 要素の配列を作成することによって作成されています。
  • $arr[89]['circread_value'] または $arr[91]['circread_value'] をエコーアウトすると、foreach() からも一貫した値が得られます。
  • foreach() に表示される (一見ランダムな) 値は、実際には配列内の他の要素からの値です (foreach を開始する前の配列)

入力配列 ($arr1 および $arr2) は次の場所にあります: http://pastebin.com/wQN8XXu2

洞察をありがとう。詳細については、遠慮なくお尋ねください。

4

3 に答える 3

0

ここで証明されているように、整数オフセットを提供することを期待しているため、foreach は内部配列ポインターを変更します

「 foreach は内部配列ポインターに依存しているため、ループ内で変更すると予期しない動作が発生する可能性があります。」

于 2012-04-04T13:29:19.770 に答える
0

コード兄弟に何か問題があります。

私はこれをテストしました

$arr = array(
    0 => array('blah' => 123.42),
    1 => array('blah' => 5488.87),
    90 => array('blah' => 669874.923)
);

for ($x = 0; $x < count($arr); $x++) {
    echo $arr[90]['blah'] . PHP_EOL;
}

foreach ($arr as $unused) {
    echo $arr[90]['blah'] . PHP_EOL;
}

そして、それはうまく出力されます:

669874.923
669874.923
669874.923
669874.923
669874.923
669874.923

あなたのコードをもう少し見せていただけませんか?

于 2012-04-04T13:29:42.343 に答える
0

問題が見つかりました。配列の 91 番目の要素は、実際には配列への参照でした。foreach は同じ変数名 (同じ配列への参照 - 質問で示したスニペットの例では $unused という名前) を使用していたため、両方が同じ配列を見ていました。

皆さんのためにここに投稿した後、配列ダンプに「&」が含まれていることに気付きました。StackOverflow はデバッグ プロセスに役立ちました。皆様のご意見に感謝します。

于 2012-04-04T16:45:51.317 に答える