教わっておきながら、ダメ出しをしてみるこのコーナーも3回目。
書くたびに、こう説明されないと理解できない私が馬鹿なんぢゃ
自己嫌悪に陥りかけますが、実際説明するとすぐに理解してくれるので
自分を励ましつつ更新してみたいと思います。
本日のお題は配列関係です。PHPさんは特によく使うので重要ですね!
曖昧なままにしておくと割りと死ねる気がします。
説明しやすいような適当な名前をつけてみました
まず、とにもかくにも配列は繰り返し処理で楽をするためにあります。
配列
最初は基本のおさらい。
$data = [111,222,333]; echo $data[1];
Excelだとこんなかんじ
いわゆるインデックス番号で数字を取り出せます。
多次元配列
これを多次元と呼ぶか実はちょっと自信ありません
$data[] = [111,222,333]; $data[] = [11,22,33,44,55];
$row=行ってイメージで把握するとわかりやすいです。
foreach ($data as $row){ echo "$row[0] $row[1] $row[2] $row[3] <br>" ; } //$row[3]はエラーが出ます!
縦でループ。それぞれをインデックス番号で指定してます。
列数が違うのでエラーが出ちゃってます。
対応するには2重ループです。
foreach ($data as $row){ foreach ($row as $col){ echo "$col "; } echo "<br>"; }
この使い方は慣れてなければ絶対に覚えましょう。
フラット型多次元配列(csv形式)
私の勝手な名付けです。
厳密には保証されていませんが、列数(各配列の要素数)と
縦で見たときのデータ型が一致しているものをこう呼びます。
$data[] = ['Sato','21','soccer','2017-03-29']; $data[] = ['Takahashi','31','baseball','2016-03-21']; $data[] = ['Yamada','41','game','2015-03-21']; foreach ($data as $row){ echo "$row[0] さん <br>"; } foreach ($data as $row){ echo $row[1]+ 5 ," 歳 <br>"; }
CSVデータを扱うことは多いです。
連想配列
上の多次元配列で思うわけです。
何列目が何のデータかわかりにくい。
そんなときに連想配列。まずはおさらい。
$data = ['name'=>'Sato','age'=>'21','hobby'=>'soccer','created'=>'2017-03-29']; echo $data['name'];
一応の注意点。
- $data[0]では取り出せません
- キー値はユニークとします(phpでは登録はできたりします)
フラット型多次元連想配列(データベース形式)
要するにデータベースにselectした時の返り値です。
この取り出し方がいまいちであれば、絶対に基本からやり直しましょう
むしろこれだけあれば結構なんとかなるかもしれません
$data[] = ['name'=>'Sato','age'=>'21','hobby'=>'soccer','created'=>'2017-03-29']; $data[] = ['name'=>'Takahashi','age'=>'31','hobby'=>'baseball','created'=>'2016-03-21']; $data[] = ['name'=>'Yamada','age'=>'41','hobby'=>'game','created'=>'2015-03-21']; foreach ($data as $row){ echo $row['name'],"さん<br>" ; }
行数に関してはインデックスが使えます。
echo $data[1]['name'] //Takahasiが返ってきます。
リスト型連想配列
勝手な名称その2。これを見たら逃げてください
もしくは、他のタイプに合わせられないかを考えましょう。
どういうわけか、よく例に出される気もします。
$data = ['SQL' => ['基礎','データベース','insert']] ; $data += ['Javascript' => ['基本構文','DOM']]; $data += ['PHP' => ['POST/GET','session','データベース操作'=>'PDO']]; echo $data['Javascript'][0];//基本構文 echo $data['PHP']['データベース操作']; //pdo
要するに最初のキー値こそ等価値。その先がぐちゃぐちゃ。
こういうのをあっさりループ出来る人はかっこいいなと思います。
プロパティ型連想配列
オブジェクトを配列に直すとこうなることが結構あります。
名称が同じでもデータとしては違う とか、そもそもキーを持ってないとかあります。
と思いきや、全く同じのもあってループに使えたりもします。
$data = ['車' => ['価格' => '1000000','重量'=> '1t', '色'=>'赤']] ; $data += ['携帯' => ['価格' => '100000','重量'=> '400g','OS' => 'android']]; $data += ['ボールペン' => ['価格'=>'100','本数'=>'10']]; $山田さんの持ち物 = $data; $sum = 0; foreach ($data as $key=>$val){ $sum += $val['価格']; } echo "山田さんの持ち物の総額は $sum円です。";
プロパティ型多次元連想配列
$山田さんの持ち物 = ['車' => ['価格' => '1000000','重量'=> '1t', '色'=>'赤']] ; $山田さんの持ち物 += ['携帯' => ['価格' => '100000','重量'=> '400g','OS' => 'android']]; $山田さんの持ち物 += ['ボールペン' => ['価格'=>'100','本数'=>'10']]; $川上さんの持ち物 = ['車' => ['価格' => '500000','重量'=> '1.5t', '色'=>'白']] ; $川上さんの持ち物 += ['携帯' => ['価格' => '90000','重量'=> '350g','OS' => 'iOS']]; $川上さんの持ち物 += ['ボールペン' => ['価格'=>'1200','本数'=>'5']]; $山川コンビの持ち物[] = $山田さんの持ち物; $山川コンビの持ち物[] = $川上さんの持ち物; $res = 0; foreach ($山川コンビの持ち物 as $row){ foreach ($row as $key => $val){ $res += $val['価格']; } } echo "山川コンビの持ち物の総額は $res 円です。";
多次元バージョンです。どちらかというと、引っ張ってきたデータが
このタイプに該当すると判断できることが大事です。
これだけ多次元部分をシートが違うことで表現してます。
こうしておくと、オブジェクト、クラスの説明に映るときに理解が早いと思います。
はい…要するにこのプロパティ型多次元連想配列とデータベース型連想配列の違いを
感覚として理解するのに時間がかかったというおちです。
というわけで、これらを覚えればなんとかなる気がするかもしれません!