Webサイト制作におけるPHPの基本(その6:foreach文、連想配列)

Webサイト制作において、PHPで名簿などを作る際に、配列と一緒に用いると便利なループ(繰り返し)構文「foreach文」についてまとめておく。

また、キーとなるデータに紐づけて複数の関連データを扱いたい場合に便利な「連想配列」についてもまとめておく。

foreach文

foreach文は、配列の処理に特化したループ構文で、配列内にあるデータの各々に対して、データが入っている順(インデックス番号順)に(同じ)処理を繰り返し適用(実行)していく。

処理の対象が配列で、配列内のすべてのデータに対して同じ処理を適用したい場合や、配列内のデータ順に処理を適用したい場合などに用いる。

書き方は下記の通り。

foreach(配列名 as 仮変数){
  配列内の各々のデータに順次適用(実行)していく処理
}

配列内のデータが順次仮変数に代入され、各データごとに処理を適用(実行)していく。

連想配列

連想配列とは、キー(⇒インデックスの役割)となるデータ群の各々に対して、(複数の)関連するデータ(値)を紐づけ、それら全体を1つのまとまりとして扱うことができる配列のこと。

連想配列の設定(作成)の仕方は下記の通り。

array(キー名1 => 値1, キー名2 => 値2, キー名3 => 値3,…) 

※「キー名」や「値」が文字列の場合はそれぞれクォートでくくる必要がある

コード中で連想配列を用いる(参照する)際の書き方は下記の通り。

$連想配列名[キー名]

foreach文で連想配列を用いる際の書き方は下記の通り。

foreach($連想配列名 as キー用仮変数 => 値用仮変数){
 連想配列内の各々のデータに順次適用(実行)していく処理
}

連想配列と配列は組み合わせて使うことができ、入れ子にすることで多次元配列を作ることもできる。

また、foreach文などのループ構文とif文などを組み合わせた際に、条件に応じて処理をとばしたり、ループを抜けたりするのに便利なbreak文とcontinue文について簡単にまとめておく。

制御文 機能
break 処理中のループから抜ける
continue ループ(繰り返し)処理における現在の周回(continue文以降の処理)をとばして次の周回に進む

※break文とcontinue文の後にはセミコロン「;」が必要

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>foreach文と連想配列</title>
<style>
h2 {
  font-size: 14px;
}
dt.one, dd.one {
  margin: 0;
  padding: 0;
}
dt.one {
  margin-left: 20px;
 width: 10px;
 float: left;
}
dd.one {
 padding-left: 40px;
}
dl {
 clear:both;
}
</style>
</head>
<body>
<h2>ただの配列</h2>
<ol>
<?php
$test1 = array('A','B','C');
foreach($test1 as $T){
 print('<li>'.$T.'</li>'."\n");
}
?>
</ol>
<h2>連想配列</h2>
<dl>
<?php
$test2 = array(
  1 => 'A',
 2 => 'B',
 3 => 'C'
);
foreach($test2 as $T => $S){
 print('<dt class="one">'.$T.'</dt>'."\n");
 print('<dd class="one">'.$S.'</dd>'."\n");
}
?>
</dl>
<h2>連想配列ネスト(入れ子)</h2>
<dl>
<?php
$test3 = array(
  '商品A' => array('100', '2013/4', '3日'),
 '商品B' => array('200', '2013/5', '5日'),
  '商品C' => array('300', '2013/6', '7日'),
 '商品D' => array('400', '2013/7', '6日'),
  '商品E' => array('500', '2013/8', '4日'),
 '商品F' => array('600', '2013/9', '2日')
);
foreach($test3 as $Item => $Spec){
 print('<dt>'.$Item.'</dt>'."\n");
 if($Item == '商品D'){
  continue;
 } else {
  for($i=0; $i<count($Spec); $i++){
   print('<dd>'.$Spec[$i].'</dd>'."\n");
  }
 }
 if($Item == '商品E'){
  print('商品Eの発売月は'.$Spec[1].'です。');
  break;
 }
}
?>
</dl>
</body>
</html>

以下、表示結果。
←クリックで拡大表示