昨日の続き。
目次
foreach
foreach (array_expression as $value)
Javaの拡張for文みたいな感じ。Javaとは配列と要素の値の順番が逆なので注意。
for (Object element : list)
連想配列を使ったリスト
配列の要素に文字列などのキーを付けられる。
普通の配列だと0,1,2,3…..と自動的に番号が振られていたが連想配列だと意味のあるキーを設定できるため、キーを指定して参照が出来て便利。
1 2 3 4 5 6 |
array( key => value, key2 => value2, key3 => value3, ... ) |
foreachを使ってループ処理も出来る。
1 |
foreach (array_expression as $key => $value) |
$keyと$valueは仮引数なので利用する場所で一致させてあげればOK。
つまり適当な名前の引数で問題ない。利用する時に同じ名前を指定すれば(繰り返し)。
こんな感じで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php $month = array( '1月' => 'January', '2月' => 'February', '3月' => 'March', '4月' => 'April', '5月' => 'May', '6月' => 'June', '7月' => 'Jury', '8月' => 'August', '9月' => 'September', '10月' => 'October', '11月' => 'November', '12月' => 'December' ); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>月の名前</title> </head> <body> 1年は<?php print(count($month)); ?>ヶ月だよ <table> <?php foreach ($month as $number => $name) { print("<tr>\n"); // htmlソースの見通しのために\nで調整してみた(大した意味はない print('<th>'.$number.'</th>'); print('<td>'.$name.'</td>'); print("\n</tr>\n"); } ?> </table> </body> </html> |
実行結果
1年は12ヶ月だよ 1月 January 2月 February 3月 March 4月 April 5月 May 6月 June 7月 Jury 8月 August 9月 September 10月 October 11月 November 12月 December
もちろん単独のキーを指定してアクセスすることも出来る。
print($month['3月']);
この場合は上記と照らし合わせると「March」が出力される。
配列の入れ子
表題の通り。連想配列のvalueをarrayにしてしまう。
ソースだけ置いておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php $list = array( '一郎' => array('男','1983/01/05','東京都大田区東蒲田1-2-2'), '二郎' => array('男','1984/05/22','東京都大田区東蒲田2-1-3'), '三郎' => array('男','1985/07/31','東京都大田区東蒲田1-3-4'), '四郎' => array('男','1986/11/11','東京都大田区東蒲田1-1-5'), '五郎' => array('男','1987/03/31','東京都大田区東蒲田4-1-6'), '六郎' => array('男','1988/10/21','東京都大田区東蒲田1-3-7'), '花子' => array('女','1989/01/02','東京都大田区東蒲田2-1-1') ); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>名前一覧</title> </head> <body> <p> <?php print(count($list)); ?>人いるよ。 </p> <table border="1"> <tr> <th>名前</th> <th>性別</th> <th>誕生日</th> <th>住所</th> </tr> <?php foreach ($list as $name => $prof) { print("<tr>\n"); print('<td>'.$name.'</td>'); print('<td>'.$prof[0].'</td>'); print('<td>'.$prof[1].'</td>'); print('<td>'.$prof[2].'</td>'); print("\n</tr>\n"); } ?> </table> </body> </html> |
配列は自由に入れ子に出来るので、多次元配列も作れる。
今回は割愛。
検索フォーム
簡単な検索フォームです。
mb_strposで入力語と一致する配列のキーがあるか調べます。
mbはマルチバイトの意味で日本語等のマルチバイト文字に対応しているということ。
とりあえずコード
検索フォーム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>名前一覧</title> </head> <body> <h1>検索</h1> <form method="GET" action="result.php"> <div> <label for="keyword">名前:</label> <input type="text" name="keyword"> </div> <input type="submit" value="検索"> </form> </body> </html> |
結果表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php $list = array( '一郎' => array('男','1983/01/05','東京都大田区東蒲田1-2-2'), '二郎' => array('男','1984/05/22','東京都大田区東蒲田2-1-3'), '三郎' => array('男','1985/07/31','東京都大田区東蒲田1-3-4'), '四郎' => array('男','1986/11/11','東京都大田区東蒲田1-1-5'), '五郎' => array('男','1987/03/31','東京都大田区東蒲田4-1-6'), '六郎' => array('男','1988/10/21','東京都大田区東蒲田1-3-7'), '花子' => array('女','1989/01/02','東京都大田区東蒲田2-1-1') ); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>名前一覧</title> </head> <body> <h1>検索結果</h1> <table border="1"> <tr> <th>名前</th> <th>性別</th> <th>誕生日</th> <th>住所</th> </tr> <?php foreach ($list as $name => $prof) { $pos = mb_strpos($name, $_GET['keyword']); if ($pos !== FALSE) { print("<tr>\n"); print('<td>'.$name.'</td>'); print('<td>'.$prof[0].'</td>'); print('<td>'.$prof[1].'</td>'); print('<td>'.$prof[2].'</td>'); print("\n</tr>\n"); } } ?> </table> </body> </html> |
検索なのでGETにしてみたが、POSTでも問題ない。
セキュリティ上問題があるならPOSTの方がよい。
mb_strpos
文字列の中に指定した文字列が最初に現れる位置を見つける
mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] )
第一引数:調べたい文字列
第二引数:第一引数の中から探す文字列
第三引数:開始位置
第四引数:文字エンコーディング
第三、第四引数は特に指定がなければ省略可。
検索結果に画像を表示する
画像用変数に代入する画像を性別で条件分岐させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php $list = array( '東京一郎' => array('男','1983/01/05','東京都大田区東蒲田1-2-2'), '千葉二郎' => array('男','1984/05/22','東京都大田区東蒲田2-1-3'), '埼玉三郎' => array('男','1985/07/31','東京都大田区東蒲田1-3-4'), '東京四郎' => array('男','1986/11/11','東京都大田区東蒲田1-1-5'), '神奈川五郎' => array('男','1987/03/31','東京都大田区東蒲田4-1-6'), '東京六郎' => array('','1988/10/21','東京都大田区東蒲田1-3-7'), '東京花子' => array('女','1989/01/02','東京都大田区東蒲田2-1-1') ); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>名前一覧</title> </head> <body> <h1>検索結果:<?php print($_GET['keyword']) ?></h1> <table border="1"> <tr> <th></th> <th>名前</th> <th>性別</th> <th>誕生日</th> <th>住所</th> </tr> <?php $count = 0; foreach ($list as $name => $prof) { $img = ''; $getstr = $_GET['keyword']; if ($getstr == NULL) { $getstr = 'no keyword no good'; } $pos = mb_strpos($name, $getstr); if ($pos !== FALSE) { if ($prof[0] === '男') { $img = 'images/male.jpg'; } else if ($prof[0] === '女') { $img = 'images/female.jpg'; } else { $img = 'images/other.jpg'; } print("<tr>\n"); print('<td><img src="'.$img.'" alt="'.$prof[0].'" /></td>'); print('<td>'.$name.'</td>'); print('<td>'.$prof[0].'</td>'); print('<td>'.$prof[1].'</td>'); print('<td>'.$prof[2].'</td>'); print("\n</tr>\n"); $count++; } } ?> </table> <?php if ($count !== 0) { print('<p>'.$count.'件一致しました。</p>'); } ?> </body> </html> |
入力語が空の時は
Warning: mb_strpos(): Empty delimiter in ファイル名 on line 43
という警告が画面に出てしまうので仮の文字列を代入している。
実行結果
どうでもいい画像についての情報
男:ライ(衝撃ゴウライガン!!)
女:ショウ(衝撃ゴウライガン!!)
その他:仮面ライダーブラーボ(仮面ライダー鎧武)
投稿フォーム
ほとんどHTMLなので解説少なめ。
連想配列で入力情報を準備しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?php $defs = array( 'name' => '東京一郎', 'email' => 'yamada@pg-box.jp', 'zip' => '111-1111','sex' => '男', 'age' => '30', 'os' => array('win', 'linux'), 'message' => '意見だよ' ); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>アンケートフォーム</title> <style type="text/css" media="all"> body { width:100%;} label { min-width:110px;display: inline-block; } div { margin: 20px auto;} </style> </head> <body> <h1>アンケート</h1> <form method="POST" action="complete.php"> <div> <label for="name">名前:</label> <input type="text" name="name" value="<?php print($defs['name']); ?>" /> </div> <div> <label for="email">メールアドレス:</label> <input type="email" name="email" value="<?php print($defs['email']); ?>" /> </div> <div> <label for="zip">郵便番号:</label> <input type="text" name="zip" value="<?php print($defs['zip']); ?>" /> </div> <div> <label for="sex">性別:</label> <?php $sexes = array('男', '女', 'その他'); foreach ($sexes as $sex) { print('<label>'); print('<input type="radio" name="sex" value="'.$sex.'"'); if ($sex === $defs['sex']) { print(' checked'); } print(' />'); print($sex.'</label>'); } ?> </div> <div> <label for="age">年齢:</label> <select name="age"> <?php for ($i=10; $i <= 50; $i += 10) { print('<option value="'. $i.'"'); if ($i === (int)$defs['age']) { print(' selected'); } print('>' . $i .'代</option>'); } ?> </select> </div> <div> <label for="os[]">ご使用のOS:</label> <?php $oss = array('win' => 'Windows', 'mac' => 'Mac', 'linux' => 'Linux'); foreach ($oss as $k_os => $v_os) { print('<label>'); print('<input type="checkbox" name="os[]" value="'.$k_os.'"'); foreach ($defs['os'] as $os) { if ($k_os === $os) { print(' checked'); } } print(' />'); print($v_os.'</label>'); } ?> </div> <div> <label for="message">サイトへのご意見:</label><br /> <textarea rows="5" cols="30" name="message"><?php print($defs['message']); ?></textarea> </div> <input type="hidden" name="quest_num" value="XXX00001" /> <input type="submit" value="送信" /> </form> </body> </html> |
キャスト
年齢の項目だけ抜粋。
48 49 50 51 52 53 54 55 56 57 58 59 |
<div> <label for="age">年齢:</label> <select name="age"> <?php for ($i=10; $i <= 50; $i += 10) { print('<option value="'. $i.'"'); if ($i === (int)$defs['age']) { print(' selected'); } print('>' . $i .'代</option>'); } ?> </select> </div> |
年齢の変数ageは文字列で設定した。
対してif文で比較しているカウンタ変数$iは整数値(int型)なので、
比較演算子===の場合は型比較までするため、intにキャストしてやる必要がある。なのでJavaと同じように(int)をつけてやる。
チェックボックスなどの複数選択可のパーツのname属性
複数あることが分かる、配列として格納出来るようにnameの末尾に[]をつける。
付け忘れると値が取得できないので注意。
その他のformパーツの種類について
こちらに一覧があります。
フォーム部品の種類を指定するtype属性
実装状況はCan I use…で確認しましょう。
これくらいしか無いでござる。
コメント
No Trackbacks.