Chapter06 配列と連想配列

概要と目標複数のデータの管理出来る
配列と連想配列を理解しよう。

複数の関連するデータは、配列や連想配列で管理すると便利。
PHPでは、この配列や連想配列をよく利用するので、理解するようにしましょう。

今回のゴール

RERUN

配列とは 複数のデータを格納できるデータ型。

配列は、複数のデータを格納出来るデータ型。
配列には「通常配列」と「連想配列」がある。

配列とは
  1. 1つの変数には1つのデータ。 1つの変数には1つのデータ。
  2. 複数のデータは、複数の変数が必要。 複数のデータには、複数の変数が必要。
  3. 1つの配列に複数のデータを格納できる。 1つの配列には、複数のデータを格納できる。
  4. 複数の共通するデータは配列が便利。 複数の共通するデータは配列が便利。

通常配列 値に部屋番号が割り当てられる配列。

通常配列は、配列内の各値にインデックス番号という、番号が割り当てられる配列で、
配列の要素を利用したい時は、このインデックス番号を指定する必要がある。

配列の作成(array関数)
$配列名 = array(値1, 値2, 値3);
(変数名)         0    1   2  ← インデックス番号(部屋番号)
配列の作成(PHP5.4 〜)
$配列名 = [値1, 値2, 値3];
(変数名)    0    1   2  ← インデックス番号(部屋番号)
配列の値にアクセス
$配列名[インデックス番号]
       添字

配列を使ってみよう。

  1. 「chapter06」 ›「array」フォルダ内の「index.php」をテキストエディタで開く
  2. <?php?> の間に$membersという配列を作成
chapter06/array/index.php
// 配列の作成
$members = array(
  '指原', '山本', '柏木', '横山'
);
  1. ?> の手前に$members配列のインデックス番号が「1」のデータを出力
chapter06/array/index.php
// 配列の作成
$members = array(
  '指原', '山本', '柏木', '横山'
);

// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「array」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/array/
ブラウザでの表示例

RERUN


反復を使って全ての値を
取り出してみよう。

配列は反復を活用することで、全ての値を効率よく取り出せる。

  1. 「chapter06」 ›「array」フォルダ内の「index.php」をテキストエディタで開く
  2. ?> の手前にfor文を使って配列の全要素を出力
chapter06/array/index.php
// 配列の作成
$members = array(
  '指原', '山本', '柏木', '横山'
);

// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本

// 反復を活用して全ての値を取り出す
for($i = 0; $i < 4; $i++) {
  echo '<p>' . $members[$i] . '</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「array」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/array/
ブラウザでの表示例

RERUN


値の変更や追加をしてみよう。

配列の各要素は、変数の様に扱える。
また、インデックス番号を指定しない場合は、配列の末尾に値が追加される

配列の作成(ブラケット構文)
$配列名[インデックス番号] = ;
  1. 「chapter06」 ›「array」フォルダ内の「index.php」をテキストエディタで開く
  2. 「反復を活用して全ての値を取り出す」処理の前で、配列内のデータの変更や、配列にデータを追加を行う
chapter06/array/index.php
// 配列の作成
$members = array(
  '指原', '山本', '柏木', '横山'
);

// 配列の値にアクセス
echo '<p>' . $members[1] . '</p>'; // 山本

// ブラケット構文による値の代入
$members[1] = 'まゆゆ'; // $members の 1号室に値を代入
$members[] = '柴田'; //  $members の 末尾に値を代入

// 反復を活用して全ての値を取り出す
for($i = 0; $i < 4; $i++) {
  echo '<p>' . $members[$i] . '</p>';
}
  1. 「反復を活用して全ての値を取り出す」処理のループの終了条件を count()関数に変更
count関数 ・・・ 配列の要素数を返す関数
count(要素数を調べたい配列, カウント方法) 
                          省略可
カウント方法に、 "COUNT_RECURSIVE" または、"1" を指定すると多次元配列の全ての要素を返す。

引数はPHPマニュアルを参照

chapter06/array/index.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>';
}
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「array」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/array/
ブラウザでの表示例

RERUN

foreach文1 配列には便利なループがある。

配列には配列の要素の数だけ処理を繰り返してくれる、
foreach文というループがある。

foreach文
foreach (配列名 as 値を1つずつ取り出す変数) {
  // 配列の要素の数だけ繰り返す処理
}

foreach文を使ってみよう。

  1. 「chapter06」 ›「foreach1」フォルダ内の「index.php」をテキストエディタで開く
  2. 冒頭の <?php?> の間に下記の都道府県の配列をコピー&ペースト
chapter06/foreach1/index.php
// 配列の作成
$prefs = array(
  '北海道', '青森県', '岩手県', '宮城県', '秋田県',
  '山形県', '福島県', '茨城県', '栃木県', '群馬県',
  '埼玉県', '千葉県', '東京都', '神奈川県', '新潟県',
  '富山県', '石川県', '福井県', '山梨県', '長野県',
  '岐阜県', '静岡県', '愛知県', '三重県', '滋賀県',
  '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県',
  '鳥取県', '島根県', '岡山県', '広島県', '山口県',
  '徳島県', '香川県', '愛媛県', '高知県', '福岡県',
  '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県',
  '鹿児島県', '沖縄県'
);
  1. <dd> ~ </dd> 内に、foreach文で都道府県のセレクトボックスを生成
chapter06/foreach1/index.php
<select id="pref" name="pref">
<?php
  foreach ($prefs as $pref) {
    // $prefs の要素の数だけ繰り返す
    echo '<option value="'. $pref .'">'. $pref .'</option>';
  }
?>
</select>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「foreach1」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/foreach1/
ブラウザでの表示例

RERUN

連想配列 添字が文字列の配列。

配列の添字は通常インデックス番号だが、任意の文字列を指定することもできる。
添字が文字列の配列のことを 連想配列と呼ぶ。

連想配列の作成(array関数)
$配列名 = array(
  'キー1' => 値1,
  'キー2' => 値2,
  'キー3' => 値3,
);
連想配列の作成(PHP5.4 ~)
$配列名 = [
  'キー1' => 値1,
  'キー2' => 値2,
  'キー3' => 値3,
];

連想配列を使ってみよう。

  1. 「chapter06」 ›「associative-array」フォルダ内の「index.php」をテキストエディタで開く
  2. <?php?> の間に、ブログ記事の連想配列を作成
chapter06/associative-array/index.php
// 配列の作成
$post = array(
  'title' => 'はじめてのブログ',
  'date' => '2018.03.03',
  'author' => '柴田',
  'content' => 'はじめまして。これからブログを頑張っていきます。'
);
  1. 連想配列を作成した<?php?>の後に、連想配列の各要素を出力
chapter06/associative-array/index.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>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「associative-array」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/associative-array/
ブラウザでの表示例

RERUN


値の変更や追加をしてみよう。

連想配列も配列と同様で、各要素の値を変更したり、追加することができる。

連想配列の作成(ブラケット構文)
$配列名[キー] = ;
  1. 「chapter06」 ›「associative-array」フォルダ内の「index.php」をテキストエディタで開く
  2. <?php?>内の、連想配列の作成処理の後で、
    連想配列のデータを変更したり、新たな要素作成したりする
chapter06/associative-array/index.php
// 配列の作成
$post = array(
  'title' => 'はじめてのブログ',
  'date' => '2018.03.03',
  'author' => '柴田',
  'content' => 'はじめまして。これからブログを頑張っていきます。'
);

// ブラケット構文による値の代入
$post['author'] = '山本'; // $post の author に値を代入
$post['category'] = 'お知らせ'; // $post の category に値を代入
  1. 日付を出力している処理の後に、カテゴリーを出力するリスト項目を追加
chapter06/associative-array/index.php
<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>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「associative-array」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/associative-array/
ブラウザでの表示例

RERUN

foreach文2foreach文は、
連想配列のキーも取得できる。

foreach文は、以下のように記述することで、
連想配列の キーも取り出すことが出来る。

foreach文
foreach (配列名 as キーを取り出す変数 => 値を取り出す変数) {
  // 配列の要素の数だけ繰り返す処理
}

foreach文で、キーを取り出してみよう。

  1. 「chapter06」 ›「foreach2」フォルダ内の「index.php」をテキストエディタで開く
  2. 冒頭の<?php?> の間に下記の連想配列を作成
chapter06/foreach2/index.php
// 連想配列の作成
$themes = array(
  'red' => '赤',
  'blue' => '青',
  'green' => '緑'
);
  1. <dd> ~ </dd> 内に、foreach文を使って、連想配列の全てのキーと値を出力
chapter06/foreach2/index.php
<select id="theme" name="theme">
<?php
  foreach ($themes as $key => $val) {
    // $themes の要素の数だけ繰り返す
    echo '<option value="'. $key .'">'. $val .'</option>';
  }
?>
</select>
  1. 上書き保存
  2. 「chapter06」 ›「foreach2」フォルダ内の「receive.php」をテキストエディタで開く
  3. head 要素内にある style要素にに下記のCSSをコピー&ペースト
chapter06/foreach2/receive.php
.red {
  background-color: #FFCDD2;
}
.blue {
  background-color: #BBDEFB;
}
.green {
  background-color: #C8E6C9;
}
  1. body要素の class属性に ユーザーから受け取った値(連想配列のキー)を付ける
chapter06/foreach2/receive.php
<body class="<?php echo htmlspecialchars($_POST['theme'], ENT_QUOTES, 'UTF-8'); ?>">
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「foreach2」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/foreach2/
  3. テーマを選んで送信すると、背景色が変わることを確認
ブラウザでの表示例

RERUN

多次元配列 配列の中に配列を格納できる。

配列は、配列の中に別の配列を格納することが出来る。
このような配列を 多次元配列という。

多次元配列を使ってみよう。

  1. 「chapter06」 ›「multidimensional」フォルダ内の「index.php」をテキストエディタで開く
  2. 冒頭の<?php?> の間に下記の配列の中に連想配列がある多次元配列を作成
chapter06/multidimensional/index.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' => 'こんにちは、今日でブログを閉鎖することにしました。'
  )
);
  1. h1要素の下に、foreach文を使って記事の一覧を作成
chapter06/multidimensional/index.php
<?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
  }
?>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「multidimensional」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/multidimensional/
ブラウザでの表示例

RERUN

制御構文をスッキリ書いてみよう。

制御構文(if文、for文、foreach文 など)は、ブロック内({ ~ })に複数のHTMLを記述すると、非常にややこしくなる。制御構文のブロック {}を下記の様に書き換えることができる

  • { ・・・ :
  • } ・・・ end制御構文名;
foreach文
<?php foreach (配列名 as 値を取り出す変数) : ?>
  ここに通常のHTMLを記述
<?php endforeach; ?>

上記は、foreach文の例だが、if文、while文 など他の制御構文でも使える。
endforeach; の部分は、endif;endwhile;など、それぞれ制御構文名に合わせて記述する。

  1. 「chapter06」 ›「multidimensional」フォルダ内の「index.php」をテキストエディタで開く
  2. h1要素の下にあるforeach文の{」を「:に、}」を「endforeach;に変更
chapter06/multidimensional/index.php
<?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; ?>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「multidimensional」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/multidimensional/
ブラウザでの表示例

RERUN

配列の中身を確認 配列の中身を知りたい時は、
print_r関数を使う。

print_r関数を使えば、配列の構造を確認することが出来る。
HTMLの <pre> ~ </pre> に出力すれば見やすい。

print_r関数 ・・・ 変数に関する情報を解りやすく出力する関数
print_r(配列を格納した変数)

詳細はPHPマニュアルを参照

print_r関数を使って、
配列の中身を確認してみよう。

  1. 「chapter06」 › 「array-check」フォルダ内の「index.php」をテキストエディタで開く
  2. h1要素の下に、print_r()関数で配列の中身を表示
chapter06/array-check/index.php
<pre>
<?php print_r($posts); ?>
</pre>
  1. 上書き保存
  2. ブラウザで「chapter06」 › 「array-check」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/array-check/
ブラウザでの表示例

RERUN

チェックボックスの送信 チェックボックスは、配列で送信する。

チェックボックスは、複数選択することが可能なため、
送信される値が1つとは限らない。その為、 配列として送信する必要がある。
name属性の末尾に、[]を付けることで配列として送信するできる。

チェックボックスを送信してみよう。

  1. 「chapter06」 ›「checkbox」フォルダ内の「index.php」をテキストエディタで開く
  2. 冒頭の <?php?> の間に下記の配列を作成
chapter06/checkbox/index.php
// 配列の作成
$softs = array(
  'Photoshop', 'Illustrator', 'Fireworks', 'XD'
);
  1. <dd></dd> の間にforeach文でチェックボックスを生成
    name属性の最後に[]を付けて配列として送信する)
chapter06/checkbox/index.php
<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>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「checkbox」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter06/checkbox/
ブラウザでの表示例

RERUN

  1. 「chapter06」 ›「checkbox」フォルダ内の「receive.php」をテキストエディタで開く
  2. h1要素の下に、選択された値が格納された配列を出力
chapter06/checkbox/receive.php
<?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; ?>
  1. 上書き保存
  2. ブラウザで「chapter06」 ›「checkbox」フォルダ内の「index.php」にアクセスし、データを送信
    http://localhost/php-lessons/chapter06/checkbox/
ブラウザでの表示例

RERUN

練習問題 今回の理解度をチェック。

「training」フォルダ内の「index.html」と「receive.php」を開き
下記の問題を解いて下さい。

ブラウザでの完成例

RERUN

「index.php」の問題

    • 職種の配列
      • 配列の変数名: 任意
      • 配列の値: "Webディレクター"、"Webデザイナー"、"Webプログラマー"、"マークアップエンジニア"
    • スキルの配列
      • 配列の変数名: 任意
      • 配列の値: "HTML"、"CSS"、"JavaScript"、"jQuery"、"PHP"、"Photoshop"、"Illustrator"、"Dreamweaver"
    • ラベル「希望職種」
      • コントロール部品の種類: "セレクトボックス"
      • コントロール部品の名前: 任意
      • コントロール部品のid名: "job"
      • コントロール部品の値: オプション項目と同じ
    • ラベル「あなたがお持ちのスキル(複数選択可)」
      • コントロール部品の種類: "checkbox"
      • コントロール部品の名前: 任意
      • コントロール部品の値: 表示項目と同じ

「receive.php」の問題

    • 文字列「希望職種」
      • 表示するデータ: 希望職種
    • 文字列「あなたがお持ちのスキル」
      • 表示するデータ: 選択された全てのスキル
解答例
chapter06/training/index.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 になるとご覧いただけます。

chapter06/training/receive.php
<!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 になるとご覧いただけます。

まとめ 複数の関連するデータは、
配列で管理する。

配列や連想配列を使えば、複数のデータの管理が行いやすいです。

  • 添字がインデックス番号の配列を、通常配列と言う。
  • 添字がキーの配列を、連想配列と言う。
  • 配列や連想配列の全要素を取り出すには、foreach文を使う。