概要と目標複数のデータの管理出来る
配列と連想配列を理解しよう。
複数の関連するデータは、配列や連想配列で管理すると便利。
PHPでは、この配列や連想配列をよく利用するので、理解するようにしましょう。
複数の関連するデータは、配列や連想配列で管理すると便利。
PHPでは、この配列や連想配列をよく利用するので、理解するようにしましょう。
配列は、複数のデータを格納出来るデータ型。
配列には「通常配列」と「連想配列」がある。
1つの変数には1つのデータ。
複数のデータには、複数の変数が必要。
1つの配列には、複数のデータを格納できる。
複数の共通するデータは配列が便利。
通常配列は、配列内の各値にインデックス番号という、番号が割り当てられる配列で、
配列の要素を利用したい時は、このインデックス番号を指定する必要がある。
array関数)$配列名 = array(値1, 値2, 値3);
(変数名) 0 1 2 ← インデックス番号(部屋番号)
$配列名 = [値1, 値2, 値3];
(変数名) 0 1 2 ← インデックス番号(部屋番号)
$配列名[インデックス番号]
添字
<?php 〜 ?> の間に$membersという配列を作成
// 配列の作成
$members = array(
'指原', '山本', '柏木', '横山'
);
?> の手前に$members配列のインデックス番号が「1」のデータを出力
// 配列の作成
$members = array(
'指原', '山本', '柏木', '横山'
);
// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本
配列は反復を活用することで、全ての値を効率よく取り出せる。
?> の手前にfor文を使って配列の全要素を出力
// 配列の作成
$members = array(
'指原', '山本', '柏木', '横山'
);
// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本
// 反復を活用して全ての値を取り出す
for($i = 0; $i < 4; $i++) {
echo '<p>' . $members[$i] . '</p>';
}
配列の各要素は、変数の様に扱える。
また、インデックス番号を指定しない場合は、配列の末尾に値が追加される
$配列名[インデックス番号] = 値;
// 配列の作成
$members = array(
'指原', '山本', '柏木', '横山'
);
// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本
// ブラケット構文による値の代入
$members[1] = 'まゆゆ'; // $members の 1号室に値を代入
$members[] = '柴田'; // $members の 末尾に値を代入
// 反復を活用して全ての値を取り出す
for($i = 0; $i < 4; $i++) {
echo '<p>' . $members[$i] . '</p>';
}
count()関数に変更
count関数 ・・・ 配列の要素数を返す関数count(要素数を調べたい配列, カウント方法)
省略可
カウント方法に、 "COUNT_RECURSIVE" または、"1" を指定すると多次元配列の全ての要素を返す。
引数はPHPマニュアルを参照
// 配列の作成
$members = array(
'指原', '山本', '柏木', '横山'
);
// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本
// ブラケット構文による値の代入
$members[1] = 'まゆゆ'; // $members の 1号室に値を代入
$members[] = '柴田'; // $members の 末尾に値を代入
// 反復を活用して全ての値を取り出す
for($i = 0; $i < count($members); $i++) {
echo '<p>' . $members[$i] . '</p>';
}
配列には配列の要素の数だけ処理を繰り返してくれる、foreach文というループがある。
foreach (配列名 as 値を1つずつ取り出す変数) {
// 配列の要素の数だけ繰り返す処理
}
foreach文を使ってみよう。<?php 〜 ?> の間に下記の都道府県の配列をコピー&ペースト
// 配列の作成
$prefs = array(
'北海道', '青森県', '岩手県', '宮城県', '秋田県',
'山形県', '福島県', '茨城県', '栃木県', '群馬県',
'埼玉県', '千葉県', '東京都', '神奈川県', '新潟県',
'富山県', '石川県', '福井県', '山梨県', '長野県',
'岐阜県', '静岡県', '愛知県', '三重県', '滋賀県',
'京都府', '大阪府', '兵庫県', '奈良県', '和歌山県',
'鳥取県', '島根県', '岡山県', '広島県', '山口県',
'徳島県', '香川県', '愛媛県', '高知県', '福岡県',
'佐賀県', '長崎県', '熊本県', '大分県', '宮崎県',
'鹿児島県', '沖縄県'
);
<dd> ~ </dd> 内に、foreach文で都道府県のセレクトボックスを生成<select id="pref" name="pref">
<?php
foreach ($prefs as $pref) {
// $prefs の要素の数だけ繰り返す
echo '<option value="'. $pref .'">'. $pref .'</option>';
}
?>
</select>
配列の添字は通常インデックス番号だが、任意の文字列を指定することもできる。
array関数)$配列名 = array(
'キー1' => 値1,
'キー2' => 値2,
'キー3' => 値3,
);
$配列名 = [
'キー1' => 値1,
'キー2' => 値2,
'キー3' => 値3,
];
<?php 〜 ?> の間に、ブログ記事の連想配列を作成
// 配列の作成
$post = array(
'title' => 'はじめてのブログ',
'date' => '2018.03.03',
'author' => '柴田',
'content' => 'はじめまして。これからブログを頑張っていきます。'
);
<?php 〜 ?>の後に、連想配列の各要素を出力<h1><?php echo $post['title']; ?></h1>
<ul>
<li>公開日: <?php echo $post['date']; ?></li>
<li>著者: <?php echo $post['author']; ?></li>
</ul>
<p>
<?php echo $post['content']; ?>
</p>
連想配列も配列と同様で、各要素の値を変更したり、追加することができる。
$配列名[キー] = 値;
<?php 〜 ?>内の、連想配列の作成処理の後で、// 配列の作成
$post = array(
'title' => 'はじめてのブログ',
'date' => '2018.03.03',
'author' => '柴田',
'content' => 'はじめまして。これからブログを頑張っていきます。'
);
// ブラケット構文による値の代入
$post['author'] = '山本'; // $post の author に値を代入
$post['category'] = 'お知らせ'; // $post の category に値を代入
<h1><?php echo $post['title']; ?></h1>
<ul>
<li>公開日: <?php echo $post['date']; ?></li>
<li>カテゴリー: <?php echo $post['category']; ?></li>
<li>著者: <?php echo $post['author']; ?></li>
</ul>
<p>
<?php echo $post['content']; ?>
</p>
foreach文は、
foreach文は、以下のように記述することで、
foreach (配列名 as キーを取り出す変数 => 値を取り出す変数) {
// 配列の要素の数だけ繰り返す処理
}
foreach文で、キーを取り出してみよう。<?php 〜 ?> の間に下記の連想配列を作成
// 連想配列の作成
$themes = array(
'red' => '赤',
'blue' => '青',
'green' => '緑'
);
<dd> ~ </dd> 内に、foreach文を使って、連想配列の全てのキーと値を出力<select id="theme" name="theme">
<?php
foreach ($themes as $key => $val) {
// $themes の要素の数だけ繰り返す
echo '<option value="'. $key .'">'. $val .'</option>';
}
?>
</select>
head 要素内にある style要素にに下記のCSSをコピー&ペースト.red {
background-color: #FFCDD2;
}
.blue {
background-color: #BBDEFB;
}
.green {
background-color: #C8E6C9;
}
body要素の class属性に ユーザーから受け取った値(連想配列のキー)を付ける<body class="<?php echo htmlspecialchars($_POST['theme'], ENT_QUOTES, 'UTF-8'); ?>">
配列は、配列の中に別の配列を格納することが出来る。
<?php 〜 ?> の間に下記の配列の中に連想配列がある多次元配列を作成
// 配列の中に連想配列
$posts = array(
array(
'title' => 'はじめてのブログ',
'date' => '2018.03.03',
'author' => '柴田',
'content' => 'はじめまして。これからブログを頑張っていきます。'
),
array(
'title' => '2回目の投稿です。',
'date' => '2018.03.04',
'author' => '柴田',
'content' => 'こんにちは、2回目のブログです。'
),
array(
'title' => 'ブログ閉鎖します。',
'date' => '2018.03.05',
'author' => '柴田',
'content' => 'こんにちは、今日でブログを閉鎖することにしました。'
)
);
h1要素の下に、foreach文を使って記事の一覧を作成
<?php
foreach($posts as $post) {
?>
<h2><?php echo $post['title']; ?></h2>
<ul>
<li>公開日: <?php echo $post['date']; ?></li>
<li>著者: <?php echo $post['author']; ?></li>
</ul>
<p>
<?php echo $post['content']; ?>
</p>
<?php
}
?>
制御構文(if文、for文、foreach文 など)は、ブロック内({ ~ })に複数のHTMLを記述すると、非常にややこしくなる。制御構文のブロック { と }を下記の様に書き換えることができる
{ ・・・ :} ・・・ end制御構文名;<?php foreach (配列名 as 値を取り出す変数) : ?>
ここに通常のHTMLを記述
<?php endforeach; ?>
上記は、foreach文の例だが、if文、while文 など他の制御構文でも使える。
endforeach; の部分は、endif;、endwhile;など、それぞれ制御構文名に合わせて記述する。
h1要素の下にあるforeach文の「{」を「:」に、「}」を「endforeach;」に変更
<?php foreach($posts as $post) : ?>
<h2><?php echo $post['title']; ?></h2>
<ul>
<li>公開日: <?php echo $post['date']; ?></li>
<li>著者: <?php echo $post['author']; ?></li>
</ul>
<p>
<?php echo $post['content']; ?>
</p>
<?php endforeach; ?>
print_r関数を使う。
print_r関数を使えば、配列の構造を確認することが出来る。
HTMLの <pre> ~ </pre> に出力すれば見やすい。
print_r関数 ・・・ 変数に関する情報を解りやすく出力する関数print_r(配列を格納した変数)
詳細はPHPマニュアルを参照
print_r関数を使って、
h1要素の下に、print_r()関数で配列の中身を表示
<pre>
<?php print_r($posts); ?>
</pre>
チェックボックスは、複数選択することが可能なため、
name属性の末尾に、[]を付けることで配列として送信するできる。
<?php 〜 ?> の間に下記の配列を作成
// 配列の作成
$softs = array(
'Photoshop', 'Illustrator', 'Fireworks', 'XD'
);
<dd> 〜 </dd> の間にforeach文でチェックボックスを生成name属性の最後に[]を付けて配列として送信する)
<ul>
<?php foreach ($softs as $soft) : ?>
<li>
<label>
<input type="checkbox" name="soft[]" value="<?php echo $soft; ?>">
<?php echo $soft; ?>
</label>
</li>
<?php endforeach; ?>
</ul>
h1要素の下に、選択された値が格納された配列を出力
<?php if ( isset($_POST['soft']) ) : ?>
<ul>
<?php foreach( $_POST['soft'] as $soft ) : ?>
<li>
<?php echo htmlspecialchars($soft, ENT_QUOTES, 'utf-8'); ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
「training」フォルダ内の「index.html」と「receive.php」を開き
<?php
// 職種の配列の作成
$jobs = array(
'Webディレクター', 'Webデザイナー', 'Webプログラマー', 'マークアップエンジニア',
);
// スキルの配列
$skills = array(
'HTML', 'CSS', 'JavaScript', 'jQuery', 'PHP', 'Photoshop', 'Illustrator', 'Dreamweaver'
);
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>練習問題6</title>
</head>
<body>
<h1>求人フォーム</h1>
<form action="receive.php" method="post">
<dl>
<dt><label for="job">希望職種</label></dt>
<dd>
<select id="job" name="job">
<?php foreach ($jobs as $job) : ?>
<option value="<?php echo $job; ?>"><?php echo $job; ?></option>
<?php endforeach; ?>
</select>
</dd>
<dt>あなたがお持ちのスキル<small>(複数選択可)</small></dt>
<dd>
<ul>
<?php foreach ($skills as $skill) : ?>
<li>
<label>
<input type="checkbox" name="skill[]" value="<?php echo $skill; ?>">
<?php echo $skill; ?>
</label>
</li>
<?php endforeach; ?>
</ul>
</dd>
</dl>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>
解答例は全問題のチェックボックスが on になるとご覧いただけます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>練習問題6</title>
</head>
<body>
<h1>入力確認</h1>
<dl>
<dt>希望職種</dt>
<dd>
<?php echo htmlspecialchars($_POST['job'], ENT_QUOTES, 'utf-8'); ?>
</dd>
<dt>あなたがお持ちのスキル</dt>
<dd>
<?php if (isset($_POST['skill'])) : ?>
<ul>
<?php foreach( $_POST['skill'] as $skill ) : ?>
<li>
<?php echo htmlspecialchars($skill, ENT_QUOTES, 'utf-8'); ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</dd>
</dl>
<p><a href="./">入力フォームに戻る</a></p>
</body>
</html>
解答例は全問題のチェックボックスが on になるとご覧いただけます。
配列や連想配列を使えば、複数のデータの管理が行いやすいです。