初心者の方、今からプログラミングを始める方、HTMLとCSSの領域から抜け出せない人たちを対象にした、PHPをできるだけ使えるようになるための方法を紹介するコーナー。
栄えある第二回は【配列編】です。
第一回を飛ばしてこのページへに来てしまい「変数って何?」というレベルの人は、第一回の【変数編】に一度目を通してみてください。
変数のことなら分かってる、または第一回を読んでくれた方は、今回の配列編をお楽しみください。
配列
変数は値や文字列を入れるような箱だと説明しました。
そんな変数に対して、配列は一つの変数の中に複数の値を入れることができる便利な機能です。
また、配列で管理ができるようになると、無駄に多くの変数を作るような手間を省くことができます。
複数の値を管理する
それでは、一般的に例えられている「フルーツ」を使って配列を作ってみましょう。
<?php
$fruits = [
'りんご', 'みかん', 'ぶどう', 'いちご',
];
?>
$fruitsという変数に、複数の果物をいれることができました。
こういった様に、[](またはarray())で囲み、コロンで区切りを付けてやることで複数の値を入れることができます。
例にしたフルーツのように、グループ化できるものを入れるときに配列は大いに役立ちます。
では、この中から特定の果物を取り出したい場合はどうしましょうか?
配列では最初から順に添え字がされています。
最初の数字は0から始まるので、りんごは0番、ぶどうは2番になります。
配列の中から値を取り出す際は、以下のようにして番号を指定するだけです。
<?php
$fruits = [
'りんご', 'みかん', 'ぶどう', 'いちご',
];
echo $fruits[2]; #ぶどう
?>
※シャープ(#)以降はコメントになります
こうすることで、配列に入ったものを自由に取り出すことができました。
フルーツの変数を$apple、$orange…といったようにいくつも準備するより、よっぽど記述量が減り、管理も楽になります。
また、途中で先ほど作ったフルーツの配列に果物を追加したくなることもあるでしょう。
今回は、マスカットを追加してみます。
<?php
$fruits = [
'りんご', 'みかん', 'ぶどう', 'いちご',
];
$fruits[] = 'マスカット';
# ['りんご', 'みかん', 'ぶどう', 'いちご', 'マスカット']
?>
配列が入っている変数に値を追加する場合は、変数の後に[]を記述しておけば、変数そのものを上書きしてしまわず、配列へ値を追加することが可能です。
連想配列とは
配列に複数の値が入れられることがわかりました。
先ほどのように4つや5つだけであれば、ぱっと見て何番にどの値が入っているかが分かりますが、10や20と数が増えていくと逆に管理が困難になってきます。
そういった時のために連想配列があります。
連想配列とは添え字ではなく、値に対してキーを割り当ててやるという形式です。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん',
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
echo $fruits['grape']; #ぶどう
?>
こうすると、りんごを取り出したいときにはapple、ぶどうを取り出したいときにはgrapeというようにわかりやすくなりました。
記述量が多くなり、後半で最初に準備した配列の値を使いたくなったとしても覚えやすいですね。
キーを割り振るためには上記の様に、値の前にキー名と=>を付けてやるだけです。また、キーがない箇所には最初の様に添え字が割り振られるので、必要な場所だけキーで管理をしておくこともできます。
先ほどのように、作った配列にキー有りのマスカットを追加したい場合は以下のようにします。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん',
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
$fruits['muscat'] = 'マスカット';
?>
こうすれば、muscatというキーのマスカットが追加されます。
現在入っているキーを指定して値を入れると、上書きすることもできます。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん',
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
$fruits['orange'] = '温州みかん';
echo $fruits['orange']; # 温州みかん
?>
また、キーを指定する際には変数を使うこともできます。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん',
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
$key = 'orange';
echo $fruits[$key]; # みかん
?>
上記の例ではorangeという値をわざわざ変数に入れてから使用しているので、そこまで便利だと感じにくいかも知れませんが、動的に$keyの中身が変わるループ文の中で使用する場合などには大いに役立ちます。
変数と配列を組み合わせていけば、今まで複数回似たような記述をしていた部分も、かなり減らすことができるでしょう。
多次元配列とは
連想配列の仕組みを理解したら、次は多次元配列について理解していきましょう。
響きだけ聞いていると難しく感じてしまいますが、使っている内に納得ができるので諦めずに進んでいってください。
変数の中に配列が入れられるように、配列の中にも配列を入れることができます。
先ほどのフルーツ配列の場合であれば、orangeの中に更に複数種類のみかんを入れるような構成になります。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => [
'有田みかん',
'温州みかん',
'愛媛みかん',
],
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
?>
ブログやネットショップのカテゴリ構造で考えていくとわかりやすいでしょう。
上記のコードであれば、フルーツというカテゴリの中には、オレンジという子カテゴリが存在しているのです。
このように、配列はどんどん入れ子にしていくことができます。このような配列を多次元配列と言います。
もちろん、入れ子にした配列に対してもキーを割り振って連想配列にすることもできます。
また、子カテゴリに該当する配列から値を取り出す際には以下のように記述します。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => [
'arita' => '有田みかん',
'unshu' => '温州みかん',
'ehime' => '愛媛みかん',
],
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
echo $fruits['orange']['ehime']; #愛媛みかん
?>
配列のキーを指定した後に、更にキーを指定するだけでその中の配列の値を取り出すことができます。
もしキーが付いていなければ、添え字を指定してやれば取り出せます。
多次元配列の仕組みを理解しておけば、膨大なデータ量になってしまってもどこに何があるかがわかりやすくなります。
また、多次元配列で管理することができれば、一つの変数を受け渡しするだけで中身すべてを伝えられるので、記述量も少なくて済みます。
家で例えると、どの家の、どの部屋の、どの机の、どの引き出しといったような考え方です。プログラミングの言語で見るから難しく感じるだけで、仕組みとしては意外と単純だったりするのです。
配列を回す
さて、配列の基本である連想配列と多次元配列について学んでいきました。
管理が楽になったとはいえ、これだけではまだまだ配列の便利さは実感しづらいでしょう。
配列を使う上で一番便利だと感じる、そして配列である意味は「回しながら使える」という点です。
文章だけでは分かりづらいので、実際に使ってみてみましょう。
foreachとは
プログラミングではループ文というものがあります。それはPHPにおいても同じです。
forやwhileなどがありますが、その中でも配列を管理する際に便利なものがforeachです。
今回はそんなforeachという関数を使いながら学んでいきます。
前項でフルーツの配列を作りました。先ほどのように一つずつ自分で取り出すのは変数に入れているのとあまり変わりません。
せっかくなので、入っている果物を順番に、そして自動的に取り出していきましょう。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん,'
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
foreach($fruits as $val){
echo $val.'<br>';
}
?>
上記の様に記述すると、以下の様に出力されます。
りんご
みかん
ぶどう
いちご
先ほどまではキーを指定して一つずつ記述していましたが、一気に配列の中の値をすべて出力できました。
ではforeachの処理部分について細かく解説をしていきます。
foreachの記述方法と仕組み
foreachの後ろにある()で、ループさせたい配列と取り出した値を格納しておく変数を指定します。
今回であれば$fruitsに入っている配列の中身を順番に取り出したいので、まず$fruitsを最初に持ってきて、asの後ろに$valという変数を指定しました。
※$valの部分は何でも構いませんが(単数形の$fruitでも可)、現在使用されている変数は控えておきましょう。
※asについては、foreachを使用する際に必要なセットだと考えておきましょう。この部分は変更してはいけません。
そして、foreachのループが適用される範囲を{}のカッコで囲みます。
こうすることで、$fruitsに入っている値の数だけ、{}内の処理を繰り返してくれます。
今回は、中身を出力したかったのでecho $valとしました。これだけだと改行されずみにくいため、後ろに改行コードをドットを使ってくっつけています。
では、流れを追いながらみてみましょう。
一回目
$fruitsの1つ目(りんご)を$valに入れる
echo $valでりんごが出力される
一回目終了
二回目
$fruitsの2つ目(みかん)を$valに入れる
echo $valでみかんが出力される
二回目終了
三回目
$fruitsの3つ目(ぶどう)を$valに入れる
echo $valでぶどうが出力される
三回目終了
四回目
$fruitsの4つ目(いちご)を$valに入れる
echo $valでいちごが出力される
四回目終了
$fruitsに入っている値の個数分処理が終わったのでforeach終了
このような流れになります。
細分化していくと、そこまで複雑な処理ではないということがわかりますね。
ループ内での値の取り出し方はわかりました。しかし、これではキーを取り出すことができません。
キーを取り出す場合は、foreachの()内に記述を追加します。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん,'
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
foreach($fruits as $key => $val){
echo $key.'<br>';
echo $val.'<br><br>';
}
?>
出力結果が見やすくなるように$valの後ろに改行タグ一つを追加しました。
こうすると、以下のような出力になります。
apple
りんご
orange
みかん
grape
ぶどう
strawberry
いちご
asの後ろに、連想配列で指定した方法と同じで=>を追加することで、キーを取り出すことができます。
りんごやみかんを入れるための変数に$valがあるように、appleやorangeもどこかへ入れてやる必要があるので、=>の前にはキー格納用の変数として$keyを指定しました。
※キー用の変数も好きな変数名をつけても構いませんが、$valと同様重複している名称は控えておきましょう。
また、全ては出力する必要がないこともあります。
例えば、「ぶどう」が嫌いなので表示をさせたくないが、その後の「いちご」は表示したいといった場合です。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん,'
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
foreach($fruits as $val){
if($val == 'ぶどう'){
continue;
}
echo $val.'<br>';
}
?>
出力内容は以下の通りです。
りんご
みかん
いちご
今回はif文を使って、ぶどうを判定しました。
if文も記述方法もforeachと似たような形式です。ifの後の()内に条件を入れておき、その条件に該当した場合は後ろの{}内に記述したことを実行させます。
※=は代入という意味なので、一致しているかを確認する際は==または===を使用します
そして、今回ifで指定した条件を言葉に訳すと
$valが「ぶどう」だった場合、continue(スキップ)して
です。
このcontinueがforeachのスキップ機能です。
continueに行き着くと、無条件で次の値の処理に移行します。今回であれば、「ぶどう」がくるとcontinueに行き着くので、その後ろに記述しているecho $valが実行されず、次の「いちご」の処理に入るという流れです。
また、スキップではなく処理そのものを中断したい場合もありますね。
そんな時はbreakをつかいます。
<?php
$fruits = [
'apple' => 'りんご',
'orange' => 'みかん,'
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
foreach($fruits as $val){
if($val == 'ぶどう'){
break;
}
echo $val.'<br>';
}
?>
出力内容は以下の通りです。
りんご
みかん
今回は「ぶどう」だけではなく「いちご」も出力されませんでした。
これは、ぶどうの処理をした際にbreakへ行き着いたため、そこでforeachそのものの処理が終了したからです。
※continueやbreakはforやwhileといったループ文でも使用できます
また、foreachの処理内に更にforeachを使うことで、多次元配列を更にループさせることもできます。
<?php
$fruits = [
'apple' => [
'shinshu' => '信州りんご',
'fuji' => 'ふじりんご',
],
'orange' => [
'arita' => '有田みかん',
'unshu' => '温州みかん',
'ehime' => '愛媛みかん',
],
];
foreach($fruits as $val){
foreach($val as $val_child){
echo $val_child.'<br>';
}
}
?>
出力結果は以下の通りです。
信州りんご
ふじりんご
有田みかん
温州みかん
愛媛みかん
最初のforeachで値を入れておいた$valがさらに配列になっているので、それをさらにforeachしました。
これをどんどんつなげていけば、どんなに深い階層まで作られた多次元配列でもループ処理をすることができます。
しかし、多すぎると処理が見にくくなることや、処理量が増えてしまって動作が遅くなってしまう場合もあるので注意が必要です。
また、foreachの中に記述したforeachに渡している値が配列でなければ、そこでエラーが発生してしまうため、多次元配列の中身をしっかりと理解しておかなければなりません。
失敗例
<?php
$fruits = [
'apple' => [
'shinshu' => '信州りんご',
'fuji' => 'ふじリンゴ',
],
'orange' => [
'arita' => '有田みかん',
'unshu' => '温州みかん',
'ehime' => '愛媛みかん',
],
'grape' => 'ぶどう',
'strawberry' => 'いちご',
];
foreach($fruits as $val){
foreach($val as $val_child){
echo $val_child.'<br>';
}
}
?>
上記の場合はエラーが発生します。処理をみてみましょう。
まず最初のforeachでappleの配列を$valに渡します。さらに入れ子にしているforeachが動くのでapple内の配列をループします。
orangeも同様に動きます。
次のgrapeの処理に入ると、最初のforeachは問題なく動きますが、入れ子にしているforeachには配列ではなく「ぶどう」という文字列を渡してしまっています。
そのため、ループが失敗してエラーが発生します。
こういったように、間違った値を投げてしまうとエラーの原因になりますので、特にループ処理をする際は気をつけておきましょう。
グローバル変数【$_POST】
最後に、グローバル変数と呼ばれる$_POSTについて少し触れたいと思います。
グローバル変数というのをざっくり説明すると、自分で変数を宣言して値を入れずとも、既に準備されている変数のことです。
$_POSTというグローバル変数に関しては、お問い合わせフォームなどでデータを送信する際に使用されています。
入力画面と確認画面と送信画面があるお問い合わせフォームを想像してください。
まずフォームに入力した値を、次の確認画面へ移動した際に受け取る必要がありますね。
ここでグローバル変数が活躍します。入力画面で入力された値は、確認ボタン(submit)を押すと$_POSTにフォームの値を入れて、確認画面へ渡してくれます。
それではフォームのコードをみてみましょう。
<form action="check.php" method="post">
<input type="text" name="name" value="名前 太郎">
<input type="text" name="ruby" value="ナマエ タロウ">
<input type="submit" value="送信">
</form>
※今回はnameとrubyの値に最初から入力値(value)を設定していますが、ブラウザ上から送信する場合は、フォームに入力されている値が送信されます
送信ボタンを押すと、formのactionで設定されているcheck.phpというページに移動します。
そして、グローバル変数である$_POSTに値を格納したいので、methodにはpostを指定しています。
上記のフォームからsubmitを押して移動してきたcheck.phpのページでは、最初から$_POSTというグローバル変数に以下の値が入った状態でスタートします。
<?php
# submitで移動してきた際の、check.phpの$_POSTの中身
[
'name' => '名前 太郎',
'ruby' => 'ナマエ タロウ',
];
?>
前の画面で、ユーザーが変数へ入れる値をフォームに入力してくれるので、check.phpで確認用に値を表示する際は$_POSTを使用することでユーザーが入力した値を使用することができます。
次の送信画面へ飛ばす際も、確認画面のinputに$_POSTの値をセットしてやれば更に次のステップへと送ることができます。
このように、配列の使い方を理解していれば、お問い合わせフォームの仕組みが理解できるようになります。
あとはそれをどの様に加工したり、表示させたり、ループさせたりすれば良いかを知っていれば、自分で自由に値を出力することができますね。
段階的に知っていけば、始めて使うような関数や、今回のようなグローバル変数といったものが出てきても、すぐに使いこなせるようになるでしょう。
まとめ
今回は配列の基本構造や使い方、foreachといったループ方法に焦点をあてて解説していきました。
この他にも、配列を加工したり、削除したり、順番をランダムに入れ替えたりするような関数が多く存在します。
もちろんそれらの使い方を覚えていくことも大切ですが、まずは配列がどういった構造になっていて、どうやれば取り出せるのか、そしてどうやればループができるのかという基本部分の理解をある程度完璧だといえる状態にしておくことのほうが大切です。
実際に使っていくことで、「こういった使い方がしたい」というときがあります。それはその時に調べても全く遅くありません。
問題なのは、調べて使ってみたとしても、実際に配列の動きがどうなっているかがわからない状態で動いてしまうほうがよっぽど危険だと言えます。
また、今回の例で出てきたようなif文などの条件分岐も覚えておくことで、より自由で複雑な仕組みを組み上げていくことができます。
ただ今回の「初心者が最短でPHPを使えるようになるための実践的な学び方」では重点的には触れていきません。
その理由は、ifに関してはその意味からできることがある程度想像しやすく、実際にプログラムが動いている流れが想像できやすいからです。
※別の単独記事で紹介しますので、その時は是非そちらを参考にしてください
最後に今回のポイントをまとめておきましょう。
配列の出し入れの方法
連想・多次元配列の構造
foreachの使い方と動き
この3つのポイントをしっかり理解しておくことができれば、基礎知識としては十分です。
HTMLとCSSだけで記述したサイトも、配列と変数を用いるだけで管理効率が格段にアップするでしょう。
ループの使い方や、フォームの使い方まで理解できれば、システム要素を含んだサイトを使いこなせるようになります。
第三回は関数についての解説です。
※変数の使い方についてまだうろ覚えの人は、第一回の解説を予習しておきましょう。