PHP基礎 (09) foreach文で簡単な検索を作る

PHP基礎 (09) foreach文で簡単な検索を作る

名前をキーにして住所を値にした連想配列の場合、キーと検索値で簡易な検索システムができます。
処理の流れは次のようになります。

  1. 検索値はユーザーにフォームのテキストボックスで入力してもらいます。
  2. 入力したデータは属性のactionで指定したphpファイルにpostという方法で送られます。
  3. フォームから送信されたデータは$_POST[]で受け取ります。
  4. $_POST[]で受け取ったデータとforeachで展開したキーの値が完全一致したならその一致したデータを表示する構文をif文で記述します。

文字列の比較

完全一致

2つの文字列が同一であるかどうか調べる演算子は「==」か「===」です。
この演算子の違いはオペランドに文字列以外の例えば数字が指定されていた場合に挙動が変わります。
「==」演算子は文字列以外のオペランドが比較されると自動的に文字列にキャストします。
「===」は文字列以外のオペランドをキャストしませんので型が違えばfalseを返します。
3 == ‘3’ trueです。
3 === ‘3’ falseです。

検索フォーム

<form method="post" action="request2.php">
<dl>
	<dt><label for="name">検索:</label></dt>
	<dd><input type="text" id="name" name="name"></dd>
</dl>
<p><input type="submit" value="送信"></p>
</form>

php側のコード
<?php
$data = array('星野一徹'=>'東京都荒川区涙橋1−1',
'星空明子'=>'東京都荒川区笑飯1−1',
'花形治'=>'東京都渋谷区松濤1−1',
'右門方策'=>'東京都奥多摩市山田1',
'アームストロング オゾン'=>'東京都新宿区大久保5',
'牧場冬彦'=>'東京都中央区弁天町',
'磯野勝三'=>'東京都文京区麹町');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP入門教室</title>
</head>
<body>
<?php
foreach($data as $name => $value){
	$pos = htmlspecialchars($_POST['name'],ENT_QUOTES, 'UTF-8');
	if($pos == $name){
	echo '<p>'.$name.':';
	echo $value.'</p>';	
	}
}
?>
</body>
</html>

文字列の検索関数

文字列から特定の文字列や文字を探す関数があります。
strpos()
この関数の第1引数は検索する文字が入ります。そして第2引数に部分一致する文字を指定します。
第2引数と一致がないとfalseを返します。一致した場合は開始位置を返します。ただし先頭の文字は0を返します。
strpos( 文字列, 検索文字 [, 開始位置])

<?php
foreach($data as $name => $prof) {
  $pos = mb_strpos($name, $_POST['keywd']);
  if ($pos !== FALSE) {
    echo '<p>'.$name.':';
	echo $value.'</p>';	
  }
}
?>

if文の判定で($pos == FALSE) とする場合は注意が必要です。先頭の文字は0を返しますので、0はFALSEと判定されてしまいます。この場合は($pos === FALSE) としなければなりません。ちなみに$pos !== FALSEは$pos が FALSE と等しくないか、同じ型でない場合に TRUEとなるためこのif文は正しく判定します 。