【学習記録:92日目】連想配列を克服×プログラミング

勉強記録

こんにちは!ぱるこです。
現在、webプログラマーを目指して、プログラミングの勉強中です。 今回のブログは、プログラミング学習3ヶ月目(後半)の記録です。

今回のブログは、学習期間3ヶ月継続達成を記念して、ジャニオタのための、プログラミングに挑戦します。
連想配列や多次元配列が苦手なジャニオタのあなたもこれで大丈夫です!(笑)

つまづいた、fetch(フェッチ)

まず、つまづいたところはたくさんあるのですが、今回はその中の1つの「fetch」について、ジャニオタと私の為に整理していきます。

fetchAll()とfetch(PDO::FETCH_ASSOC)

fetchAll()はクエリの結果を全レコードで、
fetch(PDO::FETCH_ASSOC)1レコードだけ返してくれます。

たったそれだけの違いですが、返ってくる配列の形が違うんです。

fetchAll()の場合は、多次元配列(配列の配列
fetch(PDO::FETCH_ASSOC)は、連想配列(普通の配列)で返ってきます。

配列と連想配列と多次元配列のおさらい

まず、配列からのおさらい。

①普通の配列

嵐、関ジャニ∞、Kis-My-Ft2、King & Princeが入っている箱があります。
この箱を並べただけのものが、いわゆる普通の配列です。

配列の書き方には2種類あります。

array()を使って書く方法(arrayは配列と言う意味です)
[ ]を使って書く方法

イラストの配列を、$johnnysという変数に代入しています。
それをprint_rで出力してみると、連想配列の形で出力されます。

②連想配列

連想配列とは、「キー」(箱の名前)がある配列のことを言います。
キーとは箱の名前のことです。
①の配列のようにキーを指定していない場合は、0から順に、0、1、2とキーが割り当てられます。
なので、配列は、print_rで出力した結果のように、連想配列に書き換えることが可能です。

実際にキー(箱の名前)をつけよう!

連想配列では、ジャニーズのグループの1つである、Kis-My-Ft2(以下、キスマイ)を例にあげていきます。
まず、キスマイ(変数は$kismyft2)に、「デビュー年」と「人数」と「最年長のメンバー名」の3つの情報を持たせてあげます。
3つの情報を持たせるには、箱が3つ必要です。

「デビュー年」の箱、「人数」の箱、「最年長」のと言う3つの箱を作り、その中にそれぞれ情報を入れます。

この時に、箱に付ける名前のことを「キー」と呼び、箱に入れる情報を「値」と言います。

これを実際に連想配列で書いて見ましょう!

となります。

連想配列の書き方は、

$変数 = array(
キー(箱の名前)’ => ‘値(箱に入っている情報)‘,
ー(箱の名前)’ => ‘値(箱に入っている情報)‘,
キー(箱の名前)’ => ‘値(箱に入っている情報)
);

と書くだけです。数字の場合は、シングルクォーテーションは不要ですが、
今回は、「2011年」や「7人」と文字列にしたいので、必要です。

③多次元配列

多次元配列とは、配列の中にさらに配列があるものです。
配列の中の、配列????

少し、整理しましょう。

キスマイは、ジャニーズ($johnnys)の中の配列にある箱の1つでしたね!!
ここで、①のジャニーズ($johnnys)の配列を連想配列で表してみます。

キーを指定していない、普通の配列。
普通の配列を連想配列にしたもの

キーを指定していない場合、キーは0から割り当てるんでしたね。
$johnnysの配列から、「Kis-My-Ft2」を出力したい場合は、キスマイは、$johnnysの配列の中の[1]のキーの箱に入っているので、

$johnnys[1]と指定してあげれば出力できます。

無事、’ Kis-My-Ft2 ‘が出力されました。

キスマイの箱が、$johnnys[1]にあることがわかったので、キスマイの箱の中に、先ほどのキスマイの情報をもつ配列(箱3つ分)を追加してあげましょう。

ジャニーズの配列の中にある、キスマイの箱に、さらにキスマイの情報の配列を追加したということです。
これが、配列の配列です。
代入した後の$johnnysを、print_rで出力してみます。

キスマイが入っていた[1]に、ちゃんとキスマイの情報が代入されたことがわかります。

それでは、問題!キスマイの最年長を呼んでみましょう!!

キスマイの最年長が$johnnysの配列の中のどこにいるかを考えます。
まず、$johnnysの[1]というキーの箱の中にキスマイがいます。
そして、$johnnysの[1]の中の[最年長]というキーの箱の中に、「北山宏光」がいます。

これを式で表すと

無事「北山宏光」が出力されました。

再度、fetchを考えてみよう!

データベースに入った情報を取り出す為には、「取り出す」という意味のfetchを使用します。
ウェブカツで出てくるfetchの取り出し方は、冒頭で書いた下記の2つです。

fetchAll():クエリ(SQL)の結果を全レコードで返す。多次元配列で返ってくる。
fetch(PDO::FETCH_ASSOC):クエリの結果を1レコードだけ返す。連想配列で返ってくる。

例題

さて、問題です。現在、データベースにjohnnysテーブルの中に、以下の情報が入っています。
idが「1」のレコードを全て、データベースから取り出して下さい。そして、取り出してきたデータベースの値を使って、「私は嵐が好きです。」という文章を出力して下さい。

johnnysテーブル

id = 1が条件となるので、SQL文はこのようになります。

SQL文:
$sql = ‘ SELECT * FROM johnnys WHERE id = 1;

SQL文を使って、命令・実行してきた値を、「fetchAll()」と「fetch(PDO::FETCH_ASSOC)」で取り出し、違いを見てみましょう。

fetch(PDO::FETCH_ASSOC)で取得した場合

返ってきた値を$getJohnnysに代入します。
出力してみると、$getJohnnysには連想配列が代入されます。

連想配列で返ってきます

なので、echoで呼びたい時は、 echo $getJohnnys[‘キー名’] とすればいいだけです。

私は嵐が好きです。と出力されます。
fetchAll()で取得した場合

同じく、返ってきた値を$getJohnnysに代入します。
出力してみると、$getJohnnysには多次元配列で代入されています。なので、上のやり方と同じようにechoしてしまうと、恐ろしい「Undefined index」エラーが発動します。

fetch(PDO::FETCH_ASSOC)で取得した場合と配列の形が違いますよね???
fetchAll()で取得すると、配列の配列で返ってきます。

$getJohnnysの[0]のキーの箱に、さらに嵐の情報の配列(5つの箱)が代入されています。
なので、$getJohnnysの[‘group’]の中には何もないんです。

多次元配列で返ってくるので、もちろん出力されません。

出力する為には、「嵐」という値は、$getJohnnysの[0]の箱の中の[group]という箱の中にあるので、このようになります。

「私は嵐が好きです。」と出力されました!!!

長々と、ジャニーズプログラミング失礼しました。

しかし、連想配列や多次元配列の仕組みさえわかっていれば、foreach文もすぐに理解できるようになります。
これさえわかれば、●●●●部がだいぶ楽になるのではないかな〜と思います。

GETってなに?

GETって何?という方は、がきさんのこちらのブログがめちゃくちゃわかりやすいです!!!

【PHP初心者向け】$_GET / GETメソッドの使い方|群馬とプログラミングと僕
こんにちは、がき(@gakisan8273)と申します。 プログラミングを初めて約3ヶ月になります。(2019年9月現在
体験談

私は、このエラーを解明するのに、恥ずかしながら2週間ほどかかりました。当初、「Undefined index」エラーの原因をネットでググると、$_POSTや$_GETが原因だと書かれていたので、if(!empty)など書いてみたけど、全然解決できず、debugには値がちゃんと入っているのに、echoで出力されない!!!と何度も繰り返し、無駄な労力を費やしてしまいました。連想配列や多次元配列についてわかった気でいて、実際はわかっていなかったんですね。苦い思い出です。

3ヶ月目(後半)の学習報告

最後に、今月の振り返りをします。

要した時間

時間の内訳です。

動画学習:109時間
動画学習は2周しました。1周目は何回も1回進んでは、前のレッスンに戻ったりを繰り返した結果、かなり時間がかかってしまいました。ちなみに2周とも、全コード書きました。

アウトプット:93.5時間
アウトプットの作品を2つ作りました。

1つ目は、「食器専門の架空のECサイト」

2つ目は、「架空の野球応援歌サイト」(PAYSTARS)

理解能力が乏しい為、めちゃくちゃ時間かかったけど、だいぶ成長できました!!!

勉強時間の目標と結果

3ヶ月目(後半)のプログラミングの学習時間の結果です。

目標勉強時間 平日:4h、土日祝:6h

前半・後半共に、目標時間未達成という結果に終わりました。まだまだ努力が足りませんね。反省。。。

しかし、前半よりは、後半の方が学習時間が増えました!!!
なぜなら、先週から念願の自習室に通い始めたからです!!

家での学習は、勉強に取り掛かるまでの時間が勿体無いことと、あとどうしてもやる気が継続しませんでした。なので、強制的に勉強する環境を作りました!!!

自習室の感想ですが、とても静かで(PCはOKです)、空調も効いている。
プログラミングの勉強にとても集中できます。めちゃくちゃ快適です!!

料金は、月額約1万円ですが、日割りにすると約300円です!!
カフェのコーヒーより安いではありませんか!!

なので、最近では用事がない限り、平日は仕事終わってそのまま、自習室に行き、20時〜0時までの4時間を確保することができています。このまま、このスタイルを崩さないように頑張って行きたいです。

ちなみに正直、給料が高い訳ではなく、ギリギリの生活を送っているので、この1万円を払って行くのをためらっていましたが、目標を達成するために、先行投資と考えるようにしました。

そのために、twitterをみて、周りと自分を比べてしまうこともあるけど、前を向いて頑張ります!!

タイトルとURLをコピーしました