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>

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

Webサイト制作におけるPHPの基本(その5:配列、count関数)

Webサイト制作において、PHPで名簿などを作成する際に必要となる配列についてまとめておく。

配列

配列とは、関連する複数のデータを一つのまとまりとして扱えるようにしたもの。
通常の変数では、1つの変数に1つのデータ(値)しか入れられなかったが、配列というのは一緒に複数のデータ(値)をもつことができる。

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

$配列名 = array(データ1,データ2,データ3,・・・);

また、コードで配列を用いる際には下記のような書き方となる。

$配列名[データの順番(データ数)]

[]内のデータの順番のことを「インデックス番号」または「添え字」と呼び、配列内に入れられているデータの番号(順番)を表している。
「インデックス番号」は1ではなく、0から始める点に注意が必要。

さらに、「インデックス番号」を指定して新しいデータを代入することで、その「インデックス番号」のデータを上書きすることができる。
また、「インデックス番号」を指定せずにデータを追加した場合は、その時点で配列内に存在しているデータの一番最後に追加される。

count関数

count関数は、配列内にあるデータの個数を調べる関数。
書き方は下記の通り。

count($配列名)

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>配列、count関数</title>
<style>
p.test {
  background: #ccc;		
}
</style>
</head>
<body>
<h2>参加者一覧</h2>
<?php
$data = array('相田さん','飯田さん','石田さん','岩田さん','牛田さん');
$data[2]='斉田さん';
$data[]='坂田さん';
$data[1]='';
print('<p class="test">'.$data[0].'</p>')."\n";
print('<p class="test">'.$data[1].'</p>')."\n";
print('<p class="test">'.$data[2].'</p>')."\n";
?>
<ol>
<?php
for($i = 0; $i < count($data); $i++){
print('<li>'.$data[$i].'</li>')."\n";
}
?>
</ol>
<p>参加者は<?php print(count($data)); ?>人です。</p>
</body>
</html>

以下、表示結果。

ちなみに、配列の「インデックス番号」を飛ばして指定した場合は処理が正しくされないようである。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>配列、count関数</title>
<style>
p.test {
  background: #ccc;		
}
</style>
</head>
<body>
<h2>参加者一覧</h2>
<?php
$data = array('相田さん','飯田さん','石田さん','岩田さん','牛田さん');
$data[2]='斉田さん';
$data[]='坂田さん';
$data[1]='';
$data[10]='志田さん';     //インデックス番号を飛ばして指定
print('<p class="test">'.$data[0].'</p>')."\n";
print('<p class="test">'.$data[1].'</p>')."\n";
print('<p class="test">'.$data[2].'</p>')."\n";
?>
<ol>
<?php
for($i = 0; $i < count($data); $i++){
print('<li>'.$data[$i].'</li>')."\n";
}
?>
</ol>
<p>参加者は<?php print(count($data)); ?>人です。</p>
</body>
</html>

以下、表示結果。

Webサイト制作におけるPHPの基本(その4:エスケープシーケンス)

Webサイト制作でのPHPのコーディングにおいて、ソース中の改行を意味する「\n」(\n)などの特別な意味(役割)を持った文字とクォート(シングルorダブル)との関係は、意図した結果を得るために、しっかり理解して、使い分けられるようになっておく必要がある。

既に過去の記事で少し触れているが、エスケープシーケンスとクォートとの関係についてまとめておく。

エスケープシーケンス

ソース中の改行などの役割を持った「\n」などの「\ + 特定の文字」で1文字と扱う文字をエスケープシーケンスと呼ぶ。

以下、主なエスケープシーケンス。

エスケープシーケンス 意味(役割)、呼び方
\n 改行(ラインフィード)
\r 復帰(キャリッジリターン)
\t タブ
\$ ドル記号
\\ 「\」の文字 または バックスラッシュ
\" ダブルクォート
\' シングルクォート

これらはシングルクォート内ではただの文字列として処理されるが、ダブルクォート内ではその役割(をもったもの)として処理される。

ただし、「\\」と「\'」は例外で、「\\」についてはシングルクォート内でもその役割として処理される。「\'」については特に注意が必要。下記の表示結果参照。

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>エスケープシーケンスとクォート</title>
</head>
<body>
<?php
 print( '「\」テスト1のシングル<br>')."\n";
 print( "「\」テスト1のダブル<br>")."\n";
 print( '「\\」テスト2のシングル<br>')."\n";
 print( "「\\」テスト2のダブル<br>")."\n";
 print( '「\\\」テスト3のシングル<br>')."\n";
 print( "「\\\」テスト3のダブル<br>")."\n";
 print( '「\n」テスト4のシングル<br>')."\n";
 print( "「\n」テスト4のダブル<br>")."\n";
 print( '「\\n」テスト5のシングル<br>')."\n";
 print( "「\\n」テスト5のダブル<br>")."\n";
 print( '「\\\n」テスト6のシングル<br>')."\n";
 print( "「\\\n」テスト6のダブル<br>")."\n";
 print( '「\'」テスト7のシングル<br>')."\n";
 print( "「\'」テスト7のダブル<br>")."\n";
// print( '「\\'」テスト8のシングル<br>')."\n";   この書き方はエラーになる
 print( "「\\'」テスト8のダブル<br>")."\n";
?>
</body>
</html>

以下、表示結果。左からブラウザ表示結果、ソースコードphp(コード)の順。
←クリックで拡大表示

続きを読む

Webサイト制作におけるPHPの基本(その3:htmlspecialchars関数と特殊文字)

Webサイト制作において、フォームなどでユーザーからの入力を受けとる際に用いられるhtmlspecialchars関数と、その際に必要となる特殊文字の扱いについてまとめておく。

htmlspecialchars関数

HTMLには特殊な意味(役割)を持っている文字(特殊文字)があり、その文字をHTMLでの意味(役割)としてではなく、ただの文字(見た目は記号)として表示する(させる)ために文字参照値(という言い方が正しいかどうかは分からないが)に置き換える機能を持つ関数。
フォームなどでユーザー(他者)からの悪意ある入力を無害化するのに用いられ、安全性を高めるためにも指定しておくことが望ましい。

書き方は以下の通り。

htmlspecialchars('文字列',エスケープの種類,'文字コード')

上記のような置き換えの機能を「HTMLエスケープ」と呼び、htmlspecialcharsの括弧内で、その種類(方法)を指定する。これらは文字列ではなく定数扱いになるためクォートで囲む必要はない(囲んではいけない)。
いくつか種類があるようだが、とりあえず以下の3つをメモしておく。

エスケープの種類(方法) 概要
ENT_COMPAT ダブルクォートは置き換えるが、シングルクォートは置き換えない
ENT_QUOTES シングルクォートとダブルクォートの両方を置き換える
ENT_NOQUOTES シングルクォートとダブルクォートの両方を置き換えない

※参照http://php.net/manual/ja/function.htmlspecialchars.php

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>htmlspecialchars確認</title>
</head>
<body>
<?php
print (htmlspecialchars(' "ダブル" ',ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "ダブル" ',ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "ダブル" ',ENT_NOQUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_NOQUOTES,'UTF-8').'<br>')."\n";
?>
</body>
</html>

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

続きを読む

Webサイト制作におけるPHPの基本(その2:変数、定数、データ型)

Webサイト制作におけるPHPの演算で、同じ値を使い回したりする際に必要となる変数、定数、データ型についてまとめておく。

基本概念
  • 変数:代入した値を一時的に保持し、変更ができる
  • 定数:宣言時に代入(セット)した値を保持し、変更ができない
  • データ型:文字列や数値、真偽値などのデータの種類
変数名の原則

変数に名前を付けるにあたって、以下の原則を守ること。

  • 変数名のはじめに「$」をつける
  • 変数名の先頭は英字orアンダースコア「_」であること ※数字は不可
  • 変数名の2文字目以降は英数字orアンダースコア「_」であること
  • 変数名の大文字/小文字は区別される


また、変数名を付ける際に考慮すべきこととして、以下のことがあげられる。

  • 変数が表す内容を理解しやすい名前にする
  • 無駄に長すぎず、省略しすぎない程度のものにする
  • 後で混同したりしないように、似たような名前は付けない
  • 基本的にはローマ字表記ではなく、英単語を用いるようにする
  • 記法を統一する
(主な)記法 概要
キャメルケース記法 先頭の文字を小文字にして、以降の単語の区切りを大文字にする $myValue
アンダースコア記法 すべての文字を小文字にして、単語の区切りをアンダースコアにする $my_value
Pascal記法 すべての単語の区切り(先頭の文字)を大文字にする $MyValue
続きを読む

Webサイト制作におけるPHPの基本(その1)

Webサイト制作において、ショッピングカートなどのWebアプリを制作する必要が出てくる場合がある。
その際に用いられているPHPの基本についてまとめていく。

PHPのファイル作成時のルール
PHPのコード記述時のルール
  • コードは「<?php」と「?>」の間に記述する
  • 文字列はシングルクォートで囲む(ことにする)
  • 命令文の末尾にはセミコロンをつける
  • キーワードは半角の空白で区切る
  • 大文字と小文字は区別しない(ミスを防止するため小文字で統一する)
  • 誰が見ても分かるように、コメントアウト(1行なら「//」、複数行なら「/* */」を用いてコード(処理)の概要を記しておく

※ファイルの内容がphpコードのみ(HTMLが混在しない)の場合、後の処理に余計な影響を与えることがあるので、終わりを示す「?>」は記述しない

print命令

print:文字列を出力する命令。
※「print」は関数ではないため、厳密には引数を括弧でくくる必要はない

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>print命令</title>
</head>
<body>
<?php
print('こんにちは<br>');
print'こんにちは';
?>
</body>
</html>

以下、表示結果。

結果から、括弧の有無に関わらず、正しく処理されていることが分かる。

改行(コード)の区別

改行といっても、表示(出力)結果での改行とソースコード中での改行の意味があり、それぞれ記述方法が異なるので混同しないように注意する。

  • 表示(出力)結果で改行をさせたい場合⇒brタグ
  • ソースコード中で改行させたい場合⇒「\n(バックスラッシュエヌ)」
続きを読む

カメレオンの手(バイオリウム)

以前、とある散歩番組で放送されていたのを見て、一度行ってみたいなぁと思っていた「バイオリウム」。

植物の写真が撮りたかったのと、放し飼いにされているというグリーンイグアナを見るべく行ってきました。

バイオリウムは、渋谷駅からバスで20〜30分ほどで最寄りのバス停に着き、そこから歩いて1〜2分のところにありました。

入場無料なので、さっそく中へ。

入口付近は売店になっており、野菜や植物、グッズなどが売られていました。

入ってすぐのところで、最初の生き物「ケヅメリクガメ」の登場です。

残念ながら私がいた間は、囲いの中でずっと爆睡されていたようでしたが、1mくらいの大きさで、イカツイ手の持ち主でした。

道なりを進むと、サボテンなどの中南米の植物ゾーンを抜けた先に、見たことのある姿が存在感を放っています。

出ました「ラフレシア」。

世界最大の花にして、臭い!ということで有名なこの花。

いざ!

と前に立って見ると、なんとただの模型でした…。

そりゃそうだよな。なんてったって臭いんだから。

と一人むなしく納得して、先へ進みます。

続きを読む