教わっておきながら、ダメ出しをしてみるこのコーナーも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 円です。";
多次元バージョンです。どちらかというと、引っ張ってきたデータが
このタイプに該当すると判断できることが大事です。
これだけ多次元部分をシートが違うことで表現してます。
こうしておくと、オブジェクト、クラスの説明に映るときに理解が早いと思います。
はい…要するにこのプロパティ型多次元連想配列とデータベース型連想配列の違いを
感覚として理解するのに時間がかかったというおちです。
というわけで、これらを覚えればなんとかなる気がするかもしれません!