PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのforeachループ完全ガイド!配列操作の基本構文と実践サンプル集

はじめに

PHPが提供するループ構文のひとつであるforeach文について解説します。while文・do while文・for文などの他のループ構文が、条件式やカウンタにもとづいた繰り返し処理を行うのに対し、foreach文は配列の要素を先頭から順に処理することに特化した構文で、配列操作の場面で非常に便利です。

基本構文

foreach (array_expression as $value)
    statement

foreach (array_expression as $key => $value)
    statement

1つ目の形式は、インデックス配列(添字配列)の要素を反復処理します。ループが1回まわるごとに、現在の要素が$value変数に代入されます。PHPは内部ポインタを自動的に管理しており、ループ本体の処理が終わるたびに次の要素へと進み、配列の末尾に達した時点でループが終了します。各要素の値は、foreachに続くループ本体内で自由に利用できます。

2つ目の形式は、連想配列の走査に適しています。各反復処理のたびに、現在の要素が「キー」と「値」に分解され、それぞれ$key変数と$value変数に格納されます。ループ本体の処理が完了すると、ポインタは次のキーと値のペアへ移動し、すべての要素を処理し終えた時点でループが終わります。

例1:インデックス配列の走査

<?php
$arr = array(2,4,6,8,10);
foreach ($arr as $i){
    echo $i . "*2=" . $i*2 . "\n";
}
?>

このコードを実行すると、次の結果が出力されます。

2*2=4
4*2=8
6*2=12
8*2=16
10*2=20

例2:連想配列の走査

<?php
$arr = array("Phy"=>50, "Che"=>60, "Maths"=>70, "Bio"=>80);
foreach ($arr as $sub=>$marks){
    echo "marks in $sub: " . $marks . "\n";
}
?>

このコードを実行すると、次の結果が出力されます。

marks in Phy: 50
marks in Che: 60
marks in Maths: 70
marks in Bio: 80

例3:ネストしたforeachによる2次元配列の走査

2次元配列を走査したい場合は、foreach文を入れ子(ネスト)にして使います。外側のループが各行を取り出し、内側のループがその行の各要素を処理します。

<?php
$arr1=[1,2,3,4,5];
$arr2=[6,7,8,9,10];
$twodim=[$arr1,$arr2];
foreach ($twodim as $row){
    foreach ($row as $col){
        echo $col . " ";
    }
    echo "\n";
}
?>

このコードを実行すると、次の結果が出力されます。

1 2 3 4 5
6 7 8 9 10

例4:連想配列を含む2次元配列の走査

次の例では、「生徒1人分の情報を表す連想配列」を要素として持つ2次元配列を、ネストしたforeachで走査しています。

<?php
$arr1=["rno"=>1, "name"=>"Kiran", "marks"=>50];
$arr2=["rno"=>2, "name"=>"anil", "marks"=>60];
$arr3=["rno"=>3, "name"=>"Bina", "marks"=>70];
$twodim=[$arr1,$arr2,$arr3];
foreach ($twodim as $row){
    foreach ($row as $k=>$v){
        echo $k . ":" . $v . " ";
    }
    echo "\n";
}
?>

このコードを実行すると、次の結果が出力されます。

rno:1 name:Kiran marks:50
rno:2 name:anil marks:60
rno:3 name:Bina marks:70

補足:参照渡しで配列の値を直接変更する

$valueの前に「&」を付けると、要素が参照渡しになるため、ループ内で元の配列の値を直接書き換えられます。

<?php
$arr = [1, 2, 3];
foreach ($arr as &$v){
    $v *= 10;
}
unset($v); // ループ後に参照を解除しておくのが安全
print_r($arr);
?>

このコードを実行すると、$arrの中身は [10, 20, 30] に書き換わります。

まとめ

foreach文は、配列の要素をシンプルかつ安全に反復処理できるPHPの強力なループ構文です。インデックス配列・連想配列のどちらにも対応し、ネストさせれば2次元配列も自在に扱えます。配列を扱う場面では、まずforeachの活用を検討してみましょう。

  1. C#のforeachループとは?基本構文とLinkedListを使った実例でわかりやすく解説

    C#におけるforeachループは、System.Collections.IEnumerableまたはSystem.Collections.Generic.IEnumerable<T>インターフェースを実装している型のインスタンスに含まれる各要素に対して、指定したステートメント(文)やステートメントブロックを繰り返し実行するための制御構造です。配列やリスト、LinkedListなどのコレクションを扱う際に、インデックスを意識せずシンプルに記述できるため、C#プログラミングにおいて非常に頻繁に使用されます。foreachループの基本構文foreach(要素の型 変数名 in コレクシ

  2. C#でStringBuilderをforeachループで反復処理する方法

    C#では、StringBuilderとforeachループを組み合わせることで、配列やコレクションの要素を効率的に1つの文字列へ連結できます。ここでは、文字列配列の各要素をStringBuilderに追加して出力する基本的な手順を紹介します。手順1: 文字列配列とStringBuilderを用意するまず、文字列配列とStringBuilderオブジェクトを作成します。// 文字列配列 string[] myStr = { One, Two, Three, Four }; StringBuilder str = new StringBuilder(We will print now...).Ap