PHP 入門

PHP foreach 文

foreach ループは、PHP においてアレイ(配列)を反復処理するためのスタンダードかつ高度にプロフェッショナルな構文構造です。カウンタやインデックスポインタを手動で管理する必要がある forwhile ループとは異なり、foreach はアレイの内部ポインタを自動的に処理します。これにより、データ集合を扱う際のコードがよりクリーンになり、エラーの発生確率を大幅に低減させることができます。

1. インデックス配列の反復処理

シンプルな数字をインデックスとするアレイに対して、foreach は各要素のバリアブル(値)に直接アクセスするためのショートカットを提供します。現在のイテレーション(反復)中にその要素の値を保持するテンポラリバリアブルを定義するだけで済みます。

<?php
$products = ['ノートパソコン', 'マウス', 'キーボード', 'モニター'];

foreach ($products as $product) {
    // PHP_EOL は PHP ビルトインの改行記号定数で、クロスプラットフォームに対応
    echo "商品:" . $product . PHP_EOL;
}
?>

このコードを実行すると、PHP は内部的にインデックス 0 から自動的に $products アレイをステップ実行し、最後の要素まで到達します。アレイのカウントを追跡したり、count($products) の結果と比較したりする必要は一切ありません。

2. 連想配列の操作

連想配列(アソシエイティブ・アレイ)を扱う際、foreach の真のパワーが発揮されます。連想配列では、通常「キー(識別子)」と「値(データ)」の両方が必要になります。この場合、=> オペレータ(演算子)を使用して、キーと値を同時にキャプチャするように構文を拡張できます。

<?php
$userSettings = [
    'theme' => 'dark',
    'notifications' => true,
    'language' => 'ja-JP',
    'version' => 1.2
];

foreach ($userSettings as $key => $value) {
    // 三項演算子を使用してブーリアン値をストリングにキャストして出力
    $displayValue = is_bool($value) ? ($value ? 'オン (true)' : 'オフ (false)') : $value;
    
    echo "設定項目 '{$key}' の現在の値は:{$displayValue}" . PHP_EOL;
}
?>

フォーム入力、データベースのクエリ結果、またはコンフィギュレーション(設定)オブジェクトを処理する際、キー(key)は値(value)に対して具体的なセマンティック(意味論的)なコンテキストを提供するため、この構文構造は不可欠です。

3. 参照渡しによる配列要素の修正

デフォルトでは、foreach ループ内の値バリアブルはアレイ要素の単なる「コピー(複製)」です。ループ内部でこのバリアブルを修正しても、元の配列は変更されません。
イテレーション中に元の配列の値を直接修正したい場合は、値バリアブルの前に &(アンパサンド:参照演算子)を付ける必要があります。

<?php
$prices = [10.00, 20.00, 30.00];

// 各価格に 10% の税を加算
foreach ($prices as &$price) {
    $price *= 1.10;
}

// 極めて重要:ループ終了後に参照を破棄する
unset($price);

print_r($prices);
?>

警告: ループ終了後は、必ず unset() を使用してその参照バリアブルを破棄してください。これを行わないと、$price はアレイの最後の要素に対するメモリ参照を保持し続けます。スクリプトの後続コードで、意図せず $price バリアブルを再利用して新しい値を代入すると、$prices アレイ内の最後の要素が上書きされてしまいます。これは PHP において最も悪名高いバグの原因の一つです。