12

配列内のデータに対してクリーンアップ ジョブを実行しようとしています。具体的には、エポック時間を YYYY-MM-DD に変換しています。

私はもともとこの機能を試しました:

foreach ($data as $row) {
    $row['eventdate'] = date('Y-m-d', $row['eventdate']);
}

echo '<pre>';
print_r($data);
echo '</pre>';

ただし、出力時に foreach ループがデータを更新しませんでした。

次の for ループは機能しました。

for ($i=0; $i<count($data); $i++) {
    $data[$i]['eventdate'] = date('Y-m-d', $data[$i]['eventdate']);
}

最初のループが失敗し、2 番目のループが機能したのはなぜですか? それらは同じではありませんか?

4

3 に答える 3

33

foreach現在の方法でループを使用している場合foreach ($data as $row) {$rowは「参照による」ではなく「値による」使用されています。

に を追加して、参照を更新してみて&ください$row:

foreach ($data as &$row) {
    $row['eventdate'] = date('Y-m-d', $row['eventdate']);

または、キー/値方式を使用できます。

foreach ($data as $index => $row) {
    $data[$index]['eventdate'] = date('Y-m-d', $row['eventdate']);
于 2012-10-23T02:20:27.423 に答える
7

最初の例では、参照ではなく値によってのみ行を渡します。

ドキュメントから

ループ内で配列要素を直接変更できるようにするには、$value の前に & を付けます。その場合、値は参照によって割り当てられます

したがって、参照渡しのいずれか

foreach ($data as &$row) {
   $row['eventdate'] = date('Y-m-d', $row['eventdate']);
}

または、より明示的な構文を使用します

foreach ($data as $key => $value) {
    $data[$key]['eventdate'] = date('Y-m-d', $value['eventdate']);
}

ドキュメントのこの警告も重要です

$value と最後の配列要素の参照は、foreach ループの後でも残ります。unset() で破棄することをお勧めします

于 2012-10-23T02:20:17.743 に答える
1

foreach ステートメントでは、2 番目の引数を参照渡しする必要があるためです。

ドキュメントを確認してください: http://www.php.net/manual/en/control-structures.foreach.php

于 2012-10-23T02:21:43.377 に答える