Tips

2012.12.07

PHP foreach文 【初級編 第33回】

PHP foreach文 【初級編 第33回】

foreach文

前回は while文について記載しました。
今回は foreach文について記載したいと思います。

foreach文について

foreachも、whileや forのように繰り返しの処理を実行させる文です。
ただ foreach文の場合は、配列を処理するのに適しています。

foreach文の記述のしかた

foreach文は以下のように記述します。

foreach(配列名 as 変数名){
 処理内容;
}

これは配列の中の最小値から順番に格納された値を変数名に格納しています。
1つの処理内容が終わると、配列の中から値を変数名に格納します。
また連想配列を使用していても値を簡単に取り出すことができます。

foreach文のサンプル

以下では $hairetsu に格納した値を順番に取り出して $hensuu にコピーしています。

<?php
  $hairetsu = array('1回目', '2回目', '3回目');
  foreach($hairetsu as $hensuu){
    echo "$hensuu<br>";
  }
?>

結果は以下のように表示されます。
ブラウザ確認画像

キー名の取り出し

foreachでは配列のキー名も要素と一緒に取り出すことができます。
配列からキーと要素を取り出すには、配列定義時のように キーを格納する変数 => 値を格納する変数のように記述します。

キー名も一緒に取り出すサンプル

以下では $hairetsu に格納した要素とキー名を一緒に表示しています。

<?php
 $hairetsu = array(
   "a" => "mes1",
   "b" => "mes2",
   "c" => "mes3"
 );

 foreach($hairetsu as $key => $atai){
  echo "$key に格納されているのは $atai<br>";
 }
?>

結果は以下のようにキー名と要素が表示されました。
ブラウザ確認画像

連想配列を取り出す順番について

取り出す場合は代入した順番で表示されます。
たとえ配列を使用した場合でも、連想配列の場合のように代入した順番で表示されます。

<?php
 $hairetsu[2] = "mes1";
 $hairetsu[1] = "mes2";
 $hairetsu[0] = "mes3";

 foreach($hairetsu as $key => $atai){
  echo "$key に格納されているのは $atai<br>";
 }
?>

そのため、結果は $hairetsu[2] から順番に表示されます。
ブラウザ確認画像

配列のキーが飛び飛びの場合

また配列のキーが飛び飛びになっていても順番に表示されます。
こういった処理は for文よりも簡単に記述することができます。
ただ foreachを使用する際には格納された順番に注意する必要があります。

<?php
 $hairetsu[] = "mes1";
 $hairetsu[10] = "mes2";
 $hairetsu[] = "mes3";
 $hairetsu[5] = "mes4";
 $hairetsu[] = "mes5";

 foreach($hairetsu as $key => $atai){
  echo "$key に格納されているのは $atai<br>";
 }
?>

結果は以下のようになります。
ブラウザ確認画像

ただforeachでは確実に順番が保証されるというわけではないようですので
順番を保証したい場合には、forでソートするなどを行ったほうがよいかもしれません。

foreachでコピーした値について

コピーした値を変更しても元の値は変わらない

以下のように foreachでコピーした $value を操作しても、元の $hairetsu の値は変わりません。

<?php
  $hairetsu = array(5, 50, 500);

  foreach($hairetsu as $value){
    echo "1回目: $value の値 ==".($value *= 10)."<br>";
  }

  echo "$hairetsu[0] の値 == $hairetsu[0]<br>";
  echo "$hairetsu[1] の値 == $hairetsu[1]<br>";
  echo "$hairetsu[2] の値 == $hairetsu[2]<br>";
?>

結果は以下のように、foreach実行後の $hairetsu の値は変わりません。
ブラウザ確認画像

値を変えたい場合

値を変えたい場合は、コピーを格納する変数の前に & を付けます。
すると値そのものをコピーするわけではなく、値の要素を直に参照するという意味になります。

<?php
  $hairetsu = array(5, 50, 500);

  foreach($hairetsu as &$value){
    echo "1回目: $value の値 ==".($value *= 10)."<br>";
  }

  echo "$hairetsu[0] の値 == $hairetsu[0]<br>";
  echo "$hairetsu[1] の値 == $hairetsu[1]<br>";
  echo "$hairetsu[2] の値 == $hairetsu[2]<br>";
?>

そのため、foreach実行後の値も変わります。
ブラウザ確認画像

多次元配列を使用した foreachについて

多次元配列も foreach を使用して表示できます。
多次元配列の場合は、foreach の中に foreach を記述して入れ子にする必要があります。
以下にサンプルを記述します。

<?php
  $hairetsu = array(
    "a" => array(
      "a1" => "mes1",
      "a2" => "mes2",
      "a3" => "mes3"
    ),
     "b" => array(
      "b1" => "mes4",
      "b2" => "mes5",
      "b3" => "mes6"
    )
  );

  foreach($hairetsu as $key1 => $atai1){
    echo "$key1: $key1, $atai1: $atai1<br>";
    foreach($atai1 as $key2 => $atai2){
      echo "$key2: $key2,  $atai2: $atai2<br>";
    }
    echo "---------------------------<br>";
  }
?>

最初の foreach の $atai1 が変数ではなく配列になっていました。
結果は以下のようになります。
ブラウザ確認画像

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search