こんにちは。私主催のプログラミング勉強会を開きたい一心でPHPの記事書こうと決意したたきもとです。
如何せん一人でプログラミングを続けるとペースが落ちてくるので。
ペースメーカーとして勉強会を開いたり仲間を集めたりと虎視眈々と計画を練っています。
そして、最終的にはアプリやサービスを一緒に作ってビジネスしちゃいましょう、みたいな流れになったら良いなと企てています。
さて、今回は配列について紹介します。
内容は、
-私はこう書くよ!
です。
対象読者はプログラミング初心者。
-これから始めようと思います!
-まだ数週間しか経っていません!
みたいな方々のお役に立てれば良いなと。
配列とは
データを入れる箱の総称
配列 = データを入れておく箱のカタマリ
です。
余談ですが、私は初めてPHP,というかプログラミングを始めた時に最初につまずいたのが
-変数
次につまづいたのが
-配列
です。
図に描くとこんな感じです。
これをコードで書くとこうなります。
<?php //配列定義 $hairetsu = [// data_x は省略 'data_a', 'data_b', 'data_c', ];
key(キー) と value(値) の区別が付けば使いこなせる
上のコードでは
key
を指定しませんでした。
phpは自動でkeyを割り当ててくれます。
番号は 0 からスタートです。
さっきのコードと次のコードは同じです。
<?php //配列定義 $hairetsu = [// data_x は省略 'data_a', 'data_b', 'data_c', ]; $hairetsu_2 = [ '0' => 'data_a', '1' => 'data_b', '2' => 'data_c', ]; //結果の確認 echo "<pre>"; var_dump($hairetsu); var_dump($hairetsu_2); echo "</pre>";
本当に? と思ったら var_dump.
これは後述します。
場合に依る、と言えばそれまでですが、私は滅多にkeyを振りません。
key を指定するときは
-データをDBやcsvに格納するとき
ですかね。
いずれにせよ、
-配列
-キー(key)
-値(value)
の区別がつけば、配列を使いこなせます。
配列の作り方
array を使うか [] を使うかという話です。
どちらで書いても結果は同じですが、私は [] を使う方が好きです。
$hairetsu = array();
さっきの例をarrayで書き直すと
<?php //配列定義 $hairetsu = [// data_x は省略 'data_a', 'data_b', 'data_c', ]; $hairetsu_2 = array( 'data_a', 'data_b', 'data_c', ); //結果の確認 echo "<pre>"; var_dump($hairetsu); var_dump($hairetsu_2); echo "</pre>";
もう少し試してみる
幾つかの書き方を試してみましょうか。
<?php //配列定義 $hairetsu = [// data_x は省略 'data_a', 'data_b', 'data_c', ]; $hairetsu_2 = array( '0' => 'data_a', '1' => 'data_b', '2' => 'data_c', ); $hairetsu_3 [] = 'data_a'; $hairetsu_3 [] = 'data_b'; $hairetsu_3 [] = 'data_c'; $hairetsu_4 = array('data_a'); $hairetsu_4 = array('data_b'); $hairetsu_4 = array('data_c'); //結果の確認 echo "<pre>"; var_dump($hairetsu); var_dump($hairetsu_2); var_dump($hairetsu_3); var_dump($hairetsu_4); echo "</pre>";
実行結果
array(3) { [0]=> string(6) "data_a" [1]=> string(6) "data_b" [2]=> string(6) "data_c" } array(3) { [0]=> string(6) "data_a" [1]=> string(6) "data_b" [2]=> string(6) "data_c" } array(3) { [0]=> string(6) "data_a" [1]=> string(6) "data_b" [2]=> string(6) "data_c" } array(1) { [0]=> string(6) "data_c" }
$hairetsu_4 だけ注意して下さい。
PHPは同じ変数でも最後に定義した値が適用されます。
array() を重ねたい気持ちはわかりますが、これをやっちゃうとアウトです。
連想配列
これは用語として覚えましょう、という程度。
keyに名前を付けた配列を連想配列といいます。
コードはこんな感じ。
<?php //連想配列 $data = [ 'name_1' => 'data_a', 'name_2' => 'data_b', 'name_3' => 'data_c', ]; //結果の確認 echo "<pre>"; var_dump($data); echo "</pre>"; echo 'keyを指定して表示もできるよ'."
"; echo '$data[\'name_3\']='.$data['name_3'];
実行結果
array(3) { ["name_1"]=> string(6) "data_a" ["name_2"]=> string(6) "data_b" ["name_3"]=> string(6) "data_c" } keyを指定して表示もできるよ $data['name_3']=data_c
keyに名前をつけた時は,その名前を指定して配列の操作ができます。
今回は
name_1
name_2
name_3
としました。
keyに名前をつけない場合は key = 0 から自動で振られるから、違いはここかな。
多次元配列
ここまでは1次元で考えてきました。
じゃあ2次元ならどうするの?
3次元ならどうするの?
という話です。
基本的な考えは同じなので2次元配列で解説します。
2次元配列
図で描くとこんな感じです。
結局は キーに入れたdataが配列 ということ
たとえば
data_b
が配列だった場合。
大元の$hairetsuは多次元配列になります。
コードで書くとこういうこと。
<?php //配列定義 $data_b = [ 'data_d', 'data_e', 'data_f', 'data_g', ]; $hairetsu = [// data_x は省略 'data_a', $data_b,//data_bは変数なので ''は不要 'data_c', ]; //結果の確認 echo "<pre>"; var_dump($data_b); var_dump($hairetsu); echo "</pre>"; echo 'keyを指定して表示もできるよ'."<br>"; echo '$hairetsu[1][2]='.$hairetsu[1][2];
実行結果
array(4) { [0]=> string(6) "data_d" [1]=> string(6) "data_e" [2]=> string(6) "data_f" [3]=> string(6) "data_g" } array(3) { [0]=> string(6) "data_a" [1]=> array(4) { [0]=> string(6) "data_d" [1]=> string(6) "data_e" [2]=> string(6) "data_f" [3]=> string(6) "data_g" } [2]=> string(6) "data_c" } keyを指定して表示もできるよ $hairetsu[1][2]=data_f
$hairetsu では key =1 に data_b が収まっている。
data_bは4つのデータを持っている。
たとえば、$hairetsu 内の data_f を指定したいなら
$hairetsu[1][2]
となる。
keyを2つ並べて複雑に見えるが、結局は配列の中に配列が収まっているだけの話。
もし悩んだら var_dump してね。
キーを指定して操作できる
さっきもサラッと使ったけど。
よく使う手法です。
配列のキーを指定して表示、操作することもできます。
こんな感じで。
<?php echo 'keyを指定して表示もできるよ'."<br>"; echo '$hairetsu[1][2]='.$hairetsu[1][2];
多次元といっても、1次元配列との差は
-扱うデータ自体が配列になっているかどうか
だけです。
私流 配列はこう書く
各企業やプロジェクトによって規約が異なるので,完全に趣味の話です。
そう、私ならこう書くよ、と。
array() じゃなく [] を使う
結論から。
<?php $data_a = [ 'data_a0', 'data_a1', ]; $data_b = [ 'data_b0', 'data_b1', ]; $data_c = [ 'data_c0', 'data_c1', ]; /** * これだと見にくい * そして、 array と書くのも少し手間 */ $hairetsu = array($data_a, $data_b, $data_c); /** * 私はこう書く * array を使ったとしても、必ず改行する */ $hairetsu = [ $data_a, $data_b, $data_c, ]; $hairetsu_2 = array( //array と書いたとしても1行に並べない。見にくいから。 $data_a, $data_b, $data_c, ); //結果の確認 echo "<pre>"; echo '$hairetsu='."<br>"; var_dump($hairetsu); echo '$hairetsu_2='."<br>"; var_dump($hairetsu_2); echo "</pre>";
簡単にメリットを。
-右手の小指を2回動かせば入力完了する
-補完機能プラグインをエディタに入れていれば [ を入力すれば完了する
-可読性が高い
素直に言うと、面等なんです。 array() って書くのが。
一番重視しているメリットは
-可読性
です。
いわゆる 見やすさ です。
仮に array を使っても、一列に並べることはしません。
“配列だよ”
という感じがしないので。
入っているデータは改行して書きます。
コードの見やすさ
コードなんて自分だけが読めれば良い!
と思っていましたが、
1周間前の自分
昨日の自分
今日の自分
明日の自分
1週間後の自分
は別人だと思った方が良いです。
数日前に書いたコードなんてすぐに忘れますから。
古いコードを見て
うわっ!汚い!読みづらい!
意味不明なアルファベットばっかり!
って気持ちになるなんてザラです。
だから、まずはコードを見やすくしようと思いまして。
そう、可読性を上げよう、とね。
アルファベットを少なくしよう、とね。
配列名は $ar を冠にする
可読性、というからにはパッと見てどんなデータなのか分かれば最高だなと。
これが世に言う コーディング規約 というやつだと思っています。
これは自分ルールだけど、
-配列の変数名は ar から始める
と決めています。
$arName
$arMyData
$arRanking
みたいな。
今回の例なら、自分のツール開発の時は
$arHairetsu
ってネーミングにします。
こうすれば、
「あ、配列だな」
とわかるので、var_dump する回数が減ります。
もしくは、大事なときに チェックしよう という印になります。
困ったら var_dump しよう
これ、その内記事にまとめようと思っています。
困ったら var_dump
しましょう。
配列の中身や次元は案外意図通りに作られません。
特に、私のような駆け出しは。
ちゃんと配列の中身(key, value)が狙った通りにできているかなぁ?
と不安になったら直ぐに var_dump です。
私が嵌った多次元配列
最後に私がforeachを使う時に時々ハマる例を。
配列としてデータを取得したいのならそう書こう
まず、次の例だと配列として$resultを取得できない。
いくら事前に array() として定義しても、foreach内ではそういう挙動になっていない。
最後の url_4 だけが格納されてしまう。
<?php $arUrlData = [ 'url_1', 'url_2', 'url_3', 'url_4', ]; $result = array();//ここで配列として定義しても、foreach内では1つしか格納されない foreach ($arUrlData as $url) { $result = $url; echo '$url='.$url."<br>"; } //結果確認 echo "<pre>"; echo '$resultの中身='."<br>"; var_dump($result); echo "</pre>";
実行結果
$url=url_1 $url=url_2 $url=url_3 $url=url_4 $resultの中身= string(5) "url_4"
だから、次のように書き換える。
<?php $arUrlData = [ 'url_1', 'url_2', 'url_3', 'url_4', ]; // $result = array();//ここで配列として定義しても、foreach内では1つしか格納されない foreach ($arUrlData as $url) { $result[] = $url; //ここで $result が配列であることを示す echo '$url='.$url."<br>"; } //結果確認 echo "<pre>"; echo '$resultの中身='."<br>"; var_dump($result); echo "</pre>";
実行結果
$url=url_1 $url=url_2 $url=url_3 $url=url_4 $resultの中身= array(4) { [0]=> string(5) "url_1" [1]=> string(5) "url_2" [2]=> string(5) "url_3" [3]=> string(5) "url_4" }
コードが長くなってくるとファイル冒頭で宣言することもあります。
今回のようなforeach内では配列としてデータを取得したいのなら上記のように書かないといけません。
私はこれによくハマります。
多次元にしたいなら、多次元に見えるように定義する
先述したforeachの例を紐解くとこうなります。
この書き方はアウト。
何故なら最後に定義した
$data_c
が反映されてしまい、多次元にならないから。
<?php //配列定義 $data_a = [ 'data_a0', 'data_a1', ]; $data_b = [ 'data_b0', 'data_b1', ]; $data_c = [ 'data_c0', 'data_c1', ]; $hairetsu = $data_a; $hairetsu = $data_b; $hairetsu = $data_c; //結果の確認 echo "<pre>"; var_dump($hairetsu); echo "</pre>";
実行結果
array(2) { [0]=> string(7) "data_c0" [1]=> string(7) "data_c1" }
多次元にするなら、次の内のどちらかの書き方をする。
<?php //配列定義 $data_a = [ 'data_a0', 'data_a1', ]; $data_b = [ 'data_b0', 'data_b1', ]; $data_c = [ 'data_c0', 'data_c1', ]; $hairetsu[] = $data_a;// []がついた形 $hairetsu[] = $data_b;// []がついた形 $hairetsu[] = $data_c;// []がついた形 $hairetsu_2 = [ $data_a, $data_b, $data_c, ]; //結果の確認 echo "<pre>"; echo '$hairetsu='."<br>"; var_dump($hairetsu); echo '$hairetsu_2='."<br>"; var_dump($hairetsu_2); echo "</pre>";
実行結果
$hairetsu= array(3) { [0]=> array(2) { [0]=> string(7) "data_a0" [1]=> string(7) "data_a1" } [1]=> array(2) { [0]=> string(7) "data_b0" [1]=> string(7) "data_b1" } [2]=> array(2) { [0]=> string(7) "data_c0" [1]=> string(7) "data_c1" } } $hairetsu_2= array(3) { [0]=> array(2) { [0]=> string(7) "data_a0" [1]=> string(7) "data_a1" } [1]=> array(2) { [0]=> string(7) "data_b0" [1]=> string(7) "data_b1" } [2]=> array(2) { [0]=> string(7) "data_c0" [1]=> string(7) "data_c1" } }
個人的には
$hairetsu_2
の書き方が見やすいです。
$hairetsu[] = ~~~;
$hairetsu[] = ~~~;
$hairetsu[] = ~~~;
先ほどのforeach文 14行目ではこれが繰り返されていたんです。
ただ、可読性が高いのは改行が入っている
$hairetsu_2
だと思います。
まとめ
私は可読性とデバッグの手間を考えて
$hairetsu = [
data1,
data2,
data3,
];
みたいな書き方を多用します。
array よりも [] の方が文字数も少なく、楽なので。
array を使ったとしても、1行に収めることはしません。
配列に入れるdataが1つならまだしも、複数ある場合は改行した方が見やすいです。
[amazonjs asin=”4873115655″ locale=”JP” title=”リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)”]
私は自分のコードの汚さに嫌気がさしてこの本を買いました。
-書き方を統一する事
-関数、配列の命名規則を定める事
-“_”が含まれる変数はローカル変数以外で定義する事
など、自分ルールを設けるときに参考になる事がたくさん書いてあります。
この本からは自分ルールを決めて統一したコーディングを続ける事の大切さを学びました。
本記事で紹介したように、PHPは同じ結果を得る配列の書き方が数種類あります。
functionやclassの数が増えてくると管理、可読性の重要性が分かってきます。
私のように
-自分のために走るツールを作っている方
-独学でプログラミングに取り組んでいる方
にはおすすめです。
今回は以上です。
[amazonjs asin=”4883379663″ locale=”JP” title=”3日でマスターPHP”]