こんにちは!エンジニアのノムラです。
PHPでは、他の言語同様配列変数をよく使いますが、PHPのそれは大変多機能です。今回は、特にその中でも多次元配列(たじげんはいれつ)と連想配列(れんそうはいれつ)にスポットを当てて説明します。まず、
- 多次元配列と連想配列
- 多次元配列と連想配列で値を出力
- 多次元配列と連想配列で値を追加
で、多次元配列と連想配列の基本的な処理から、
- 多次元配列の合計を取得する方法
- 連想配列の値の合計を取得する方法
で、具体的にこれらの配列の取り扱いと合計の取り方について説明します。
PHPで開発を進めるうえで、多次元配列・連想配列への理解は必須になるので、しっかりマスターしましょう!
多次元配列とは
多次元配列とは、配列の中にさらに配列がはいっている状態になります。
図にしてみるとこのような構造になっています。
実際のコードは、以下のようになります。
$array = [ [‘田中’,25,’女性’], [‘樋口’,32,’男性’], [‘山本’,16,’女性’] ];
配列$arrayのなかに、ユーザの情報が配列になって入っていることがわかるかと思います。
キーを指定して値を出力
多次元配列の出力時の考え方は配列を扱うときとほとんど同じです。$arrayの何個目の値(配列)か、さらにその配列の中の何個目の値かを指定します。
先ほどと同じ多次元配列で構造をみていきましょう。
$array = [ [‘田中’,25,’女性’], [‘樋口’,32,’男性’], [‘山本’,16,’女性’] ];
図に落とし込むとこのような図になります。
これを踏まえて出力したい情報を指定すると、以下のようになります。
<?php $array = [ ['田中',25,'女性'], ['樋口',32,'男性'], ['山本',16,'女性'] ]; echo $array[1][0].'('.$array[1][1].'歳'.$array[1][2].')'; ?>
実行結果
樋口(32歳男性)
多次元になっている配列の値もとりだすことができました。
ループで値をすべて出力
次にforeach文をつかって多次元配列の値をすべて出力してみましょう。
<?php $array = [ ['田中',25,'女性'], ['樋口',32,'男性'], ['山本',16,'女性'] ]; foreach($array as $vals){ echo $vals[0].'('.$vals[1].'歳'.$vals[2].')'; echo '<br>'; } ?>
実行結果
田中(25歳女性) 樋口(32歳男性) 山本(16歳女性)
配列の中の値(配列)をforeach文でループして、すべて出力できました。
ループについて詳しく知りたい方は以下の記事を参考にしてみてください。
foreach文、while文など、多次元配列を扱うときに必要なループについて解説されています。
値の追加
多次元配列に値を追加してみましょう。
<?php $array = [ ['田中',25,'女性'], ['樋口',32,'男性'], ['山本',16,'女性'] ]; $array[] = ['鈴木',65,'男性']; print_r($array); ?>
実行結果
Array ( [0] => Array ( [0] => 田中 [1] => 25 [2] => 女性 ) [1] => Array ( [0] => 樋口 [1] => 32 [2] => 男性 ) [2] => Array ( [0] => 山本 [1] => 16 [2] => 女性 ) [3] => Array ( [0] => 鈴木 [1] => 65 [2] => 男性 ) )
$arrayの一番最後の値に、「鈴木」のデータの配列が追加されていることがわかると思います。
連想配列とは
多次元配列は、配列の中に配列があるイメージだと解説しましたが、連想配列もほとんど同じです。
違う点といえば、配列のなかの配列にそれぞれ名前がついているという点です。
以下のような形になります。
$array = [ '赤'=>['リンゴ','イチゴ','トマト'], '緑'=>['メロン','キュウリ','ピーマン'], '黄'=>['バナナ','パイナップル','レモン'] ];
配列$arrayの中の配列にはそれぞれ、赤、緑、黄の名前がついていて、多次元配列と少し違った形になっていますね。赤、緑、黄がそれぞれの配列のキー名になっています。
キーを指定して値を出力
出力する場合は、キーを指定して出力しましょう。
<?php $array = [ '赤'=>['リンゴ','イチゴ','トマト'], '緑'=>['メロン','キュウリ','ピーマン'], '黄'=>['バナナ','パイナップル','レモン'] ]; echo $array['赤'][0] ?>
実行結果
リンゴ
キー名が「赤」の配列の0番目の値「リンゴ」を出力することができました。
ループ(foreach)でキーと値を出力
foreach文をつかって連想配列の、キーと値を出力してみましょう。
<?php $array = [ '赤'=>['リンゴ','イチゴ','トマト'], '緑'=>['メロン','キュウリ','ピーマン'], '黄'=>['バナナ','パイナップル','レモン'] ]; foreach($array as $key=>$vals){ echo $key.'色の食べ物は'.$vals[0].','.$vals[1].','.$vals[2]; echo '<br>'; } ?>
実行結果
赤色の食べ物はリンゴ,イチゴ,トマト 緑色の食べ物はメロン,キュウリ,ピーマン 黄色の食べ物はバナナ,パイナップル,レモン
連想配列だと、キー名と値を出力しました。
と不安に感じた方は以下の記事を参考にしてみてください。foreachの基本的な使い方からわかりやすく解説されています。
キーを指定して値を追加
連想配列で、指定したキー名の配列に値を追加する場合のサンプルをみてみましょう。それでは、多次元配列と連想配列を実際に扱ってみましょう。
<?php $array = [ '赤'=>['リンゴ','イチゴ','トマト'], '緑'=>['メロン','キュウリ','ピーマン'], '黄'=>['バナナ','パイナップル','レモン'] ]; $array['赤'][] = 'サクランボ'; print_r($array); ?>
実行結果
Array ( [赤] => Array ( [0] => リンゴ [1] => イチゴ [2] => トマト [3] => サクランボ ) [緑] => Array ( [0] => メロン [1] => キュウリ [2] => ピーマン ) [黄] => Array ( [0] => バナナ [1] => パイナップル [2] => レモン ) )
上のサンプルでは、「赤」の配列に「サクランボ」という値を追加しました。赤の配列の一番最後にサクランボが追加されていることが確認できると思います。
多次元配列の合計を取得する方法
多次元配列と連想配列について解説しましたが、実際に2つの配列を使ってみながら2つの配列の構造の理解を深めていきましょう。
ここでは、配列の中に配列が入っているということはどういうことなのかを、配列の合計を取る例を通して説明します。配列の合計を取るにはforeachのようなループで合計を取る方法と、array_sum関数を用いる方法があります。
ループで要素をひとひとつずつ取得する
まずはループで要素を一つずつ取得する方法を紹介します。以下のサンプルを見てください。
<?php $array1 = [5, 3, 2]; $array2 = [7, 5, 3, 8]; $arrays = [$array1, $array2]; $sum = 0; foreach($arrays as $array) { foreach($array as $value) { $sum += $value; } } echo $sum; ?>
これを実行すると、結果は以下の通りになります。
33
ここでは、$array1という配列と、$array2という配列を二つ作り、さらに、それらの配列を成分として持つ$arraysという配列を用意しています。
つまり、$array,$arrary1の成分は整数ですが、$arraysは成分として値ではなく配列を持つということになるわけです。PHPではこのような方法で多次元配列を実現しています。
このサンプルでは外側のループで$arraysから配列を一つずつ取り出し、そして内側のループではその配列の整数値を合計していっています。
これにより多次元配列の全値を合計しています。
array_sum関数を用いる
配列の合計を求めるには、array_sum配列を用いるとさらに便利です。
<?php $array1 = [5, 3, 2]; $array2 = [7, 5, 3, 8]; $arrays = [$array1, $array2]; $row_sum = array_map(function($row){ return array_sum($row); }, $arrays); echo array_sum($row_sum); ?>
この例では$array1と$array2に、array_sum関数によって取得した合計を返すコールバック関数を適用しています。
ここで使用しているarray_map関数は、配列のすべての要素にコールバック関数を適用することができます。第一引数にコールバック関数を指定し、第二引数以降ではコールバック関数を適用する配列を指定します。
多次元配列は繰り返し合計を出さなくてはならないので、このような場合コールバック関数を用いると便利です。なお、array_map関数については詳しく知りたい方は、以下を参考にしてみてください。
連想配列の値の合計を取得する方法
次は連想配列の例を見てみることにします。連想配列は要素のキーとして何が来るかわかりません。したがって、やりかたは要素をインデックスとして用いる普通の配列とはやり方が少し違ってきます。
連想配列の値の合計を取得する
では、実際に連想配列の値の合計を取るサンプルを見てみることにします。
以下のサンプルを実行してみてください。
<?php $array = ['a'=>10, 'b'=>20, 'c'=>30]; echo array_sum(array_values($array)); ?>
実行結果
60
ここで出てくる配列は、キーとして、’a’,’b’,’c’などといった文字列を取ります。それに対応する値がそれぞれ10,20,30となっています。
このように。
$配列名 = [$キー1 => 値1, $キー2 => 値2 , …]
もしくは
$配列名 = array($キー1 => 値1, $キー2 => 値2 , … )
という組み合わせで定義されるのが連想配列です。すでに説明した通りキーは数値である必要はありません。
たとえば、以下のようにして用いるわけです。
$array['banana'] = 'バナナ'; $array['mikan'] = 'みかん';
この場合はキーにあたる部分も値も文字列になっているのがわかります。さらに、array_valuesという関数を用いると、連想配列の値をすべて一次元配列として取得することができるのです。
このサンプルでは、array_valuesという関数を用いて、連想配列の値のみからなる一次配列を作りそれをarray_sum関数で合計しているのです。
参考までに、キーの値の一覧を取得するには、array_keys関数を用いることができます。
以上のように用いられる配列の種類が違うとその合計を出す方法も少しは変わってきます。
指定したキーの値だけを合計する
せっかく連想配列を用いるのですから、連想配列ならではの使い方も紹介しましょう。
連想配列を用いると、指定したキーだけの合計値を取得することもできます。
そのためには、array_columnsという関数を用います。
array_column(多次元配列, 値を返したいキー)
この関数は第一引数に多次元配列、第二引数に値を返したいキーを指定します。
第一引数の多次元配列から、第二引数で指定したキーの値だけを取り出し配列で返します。
実際にこれを使ったサンプルを見てみましょう。
<?php $colors1 = ['red'=>10, 'blue'=>20, 'yellow'=>30]; $colors2 = ['yellow'=>10, 'red'=>30, 'green'=>50]; $colors = [$colors1, $colors2]; echo array_sum(array_column($colors, 'red')); ?>
40
このサンプルでは、キーにredと指定されているものだけの値を合計しています。したがって、合計は40になるわけです。このキーの部分をいろいろと変えて実行してみてください。
なお、array_column関数については以下で詳しく説明しています。興味のある方は参考にしてみてください。
配列を扱う便利な関数
ここでは多次元配列及び連想配列の合計を用いる方法を紹介してきました。
その過程で、配列の関数である、array_sumをはじめとする様々な関数を紹介してきました。PHPの配列およびその関数を操作するにはこのほかにも多くの関数があります。さらに学習したい方は、以下を参考にしてみてください。
配列を扱う便利な関数について、わかりやすく解説されています。
PHPを継続的に学習するコツ
PHPの学習をしていて、わからないところが多く何回も調べながらやるのは正直、嫌になってしまいますよね。そこで、どのようにすれば継続的に学習を続けて行けるのかそのコツをご紹介します。
目的を明確にする
まずは、なぜPHPを学んでいるのか明確にしましょう。例えば、PHPを学んで
- Webサイトが作りたい
- WordPressの編集がしたい
- エンジニアとして転職したい
- フリーランスを目指したい
など、目的は色々あると思います。
この目的を明確にすることがとても大事で、PHPを学ぶ学習意欲に繋がっていきます。目的がないまま学習をしていると、学習すること自体が目的になってしまい、ゴールのない果てしない道を進むことになります。その結果、挫折してしまう人が多いのが現状となっています。
そうならないためにも、PHPを学ぶ目的は言えるようにしましょう。もし言えない場合は、学ぶプログラミング言語自体間違っている可能性もあります。なので、しっかり目的から学んでいる言語があっているか確認しましょう。
学習プランを決める
目的が明確になったら、次に学習プランを立てましょう。この学習プランを立てずに学習している人が多いのですが、学習プランがないと自分が今どのくらい進んでいて、後どのくらい学習をすればいいのか見えないので、学習をすること自体がきつく長続きしません。
学習を継続的に続けるためには学習プランは必須とも言えます。いつまでに、どのレベルになっていて、最終的なゴールはいつ達成するのかはしっかり決めましょう。
先生を見つける
「何度もエラーになって、自分で調べては修正する」この繰り返しがPHPを学習していると起こります。調べてもよくわからないし、時間もかかってしまってプラン通りに学習が進まないというのは当然のように起こります。
このように思い、学習をすること自体に嫌気が指して挫折してしまう人も多いです。
そうならないためにも、「先生」を見つけることが大事になります。先生と言ってもそう簡単に探せそうにないですよね。最近ではSNSでもコミュニティーが増え、相談しやすい環境が増えてきています。こういったコミュニティーや勉強会を利用して先生を見つけるのも一つの手です。
自分に投資することも大事
学習サイトやアプリなど、無料で学習できる環境が整ってはいるものの自分に投資して学習をすることも大事です。本や有料学習サイトは、無料では学べない範囲の学習や機能が付いているので、効率的に学習をすることが可能です。
そして、投資のもう一つの方法がプログラミングスクールで学ぶことです。
独学と違い、プログラミングスクールでは上で紹介した学習を継続するためのサポートが徹底されているので、最も効率の良い学び方と言えるでしょう。先生も自分で探す必要がないので、エラーなどで躓いて時間がかかる心配もありません。
ですが、当然いきなりスクールに入るのは抵抗がありますよね。
その場合は、弊社で行っている無料カウンセリングへ参加してみてください。この無料カウンセリングでは、なぜPHPを学ぶのかその目的をヒアリングして、本当にPHPを学ぶべきなのか、その学習プランはどのように立てるのかなどの提案をしています。
目的をヒアリングすることで、あなたに最適な言語や学習プランが分かるので、最速でエンジニアを目指せるイメージがわきます。
手軽にしかもオンラインでも受けられるので、ぜひ一度目的を明確にしてみましょう。
まとめ
ここではPHPの多次元配列と連想配列について以下のような流れで説明してきました。
- 多次元配列と連想配列について
- 多次元配列の合計を取得する方法
- 連想配列の値の合計を取得する方法
- array関数についてもっと詳しく知りたい方へ
PHPの配列は大変奥が深く有効に使えば非常に効率的なプログラミングが可能です。興味を持たれた方は更にいろいろ勉強してみて下さい。