なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

PHPのここをもっとちゃんと教えてよ!~その3:連想配列、配列、データ形式のタイプ別解説~

f:id:nazuna_0124:20170329192937p:plain

教わっておきながら、ダメ出しをしてみるこのコーナーも3回目。


書くたびに、こう説明されないと理解できない私が馬鹿なんぢゃ


自己嫌悪に陥りかけますが、実際説明するとすぐに理解してくれるので

自分を励ましつつ更新してみたいと思います。


本日のお題は配列関係です。PHPさんは特によく使うので重要ですね!

曖昧なままにしておくと割りと死ねる気がします。


説明しやすいような適当な名前をつけてみました


まず、とにもかくにも配列は繰り返し処理で楽をするためにあります。


配列

最初は基本のおさらい。

$data = [111,222,333];

echo $data[1];

Excelだとこんなかんじ

f:id:nazuna_0124:20170329201003p:plain

いわゆるインデックス番号で数字を取り出せます。

多次元配列

これを多次元と呼ぶか実はちょっと自信ありません

$data[] = [111,222,333];
$data[] = [11,22,33,44,55];

f:id:nazuna_0124:20170329201737p:plain


$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>";
}

f:id:nazuna_0124:20170329201954p:plain


CSVデータを扱うことは多いです。


連想配列

上の多次元配列で思うわけです。

何列目が何のデータかわかりにくい。

そんなときに連想配列。まずはおさらい。

$data = ['name'=>'Sato','age'=>'21','hobby'=>'soccer','created'=>'2017-03-29'];

echo $data['name'];

f:id:nazuna_0124:20170329202228p:plain

一応の注意点。

  • $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>" ;
}

f:id:nazuna_0124:20170329202339p:plain

行数に関してはインデックスが使えます。

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

f:id:nazuna_0124:20170329210054p:plain

要するに最初のキー値こそ等価値。その先がぐちゃぐちゃ。

こういうのをあっさりループ出来る人はかっこいいなと思います。

プロパティ型連想配列

オブジェクトを配列に直すとこうなることが結構あります。

名称が同じでもデータとしては違う とか、そもそもキーを持ってないとかあります。

と思いきや、全く同じのもあってループに使えたりもします。

$data = ['車' => ['価格' => '1000000','重量'=> '1t', '色'=>'赤']] ;
$data += ['携帯' => ['価格' => '100000','重量'=> '400g','OS' => 'android']];
$data += ['ボールペン' => ['価格'=>'100','本数'=>'10']];

$山田さんの持ち物 = $data;

$sum = 0;
foreach ($data as $key=>$val){
    $sum += $val['価格'];
}

echo "山田さんの持ち物の総額は $sum円です。";

f:id:nazuna_0124:20170329210238p:plain


プロパティ型多次元連想配列

$山田さんの持ち物 = ['車' => ['価格' => '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 円です。";

f:id:nazuna_0124:20170329210805p:plain



多次元バージョンです。どちらかというと、引っ張ってきたデータが

このタイプに該当すると判断できることが大事です。


これだけ多次元部分をシートが違うことで表現してます。

こうしておくと、オブジェクト、クラスの説明に映るときに理解が早いと思います。


はい…要するにこのプロパティ型多次元連想配列とデータベース型連想配列の違いを

感覚として理解するのに時間がかかったというおちです。


というわけで、これらを覚えればなんとかなる気がするかもしれません!