はもちくわ

コードについて自分なりの解釈を書いてます。

【PHP】データベースを連想配列でExcelみたいにできるかな?


私は、web上でデータベースからデータを出したり、入れたり、集計したりするためにPHPをよく使ってコードを書いて処理しています。

でも、そういったデータベースの形をしたデータの処理って現実世界ではExcelをよく使いますよね。そうすると頭にExcelが入っているから、Excelみたいにwebのデータベースって扱えないのかな〜って思うことがよくあります。みなさんはどうでしょうか?

そこで、自分でいろいろやってみてわかったことをまとめてみます。

 

 

その1 データベースから出てきたデータイメージ

f:id:hamochikuwa440:20210223201036p:plain

 

データベースから出てきたデータはこういうイメージで$dataという変数に入っています。表が入っているの?と思われる方もいらっしゃるかもしれませんが、イメージとしては、表の中の場所(座標)とその値がセットになって上の行から順番に入っています。よくデータのことをレコードって言いいますよね?

人間の目には表にみえますが、中ではデータが横に数珠つなぎになっているイメージです。そして、データベースから取ってこないで、上の絵と同じように変数$dataにデータを格納するコードを書いたとすると、、、

 

f:id:hamochikuwa440:20210215104655p:plain

こうなります。実際にはfor文とかでループさせるものですが、イメージを取るならこっちの方が取りやすいかなと思いまして書いてみました。あと、あまりこういう原始的な書き方は別のページではあまり紹介されてないので、少しぐらい稚拙でもいいじゃない、、、ということでご勘弁ください。

 

 

その2 ループで探すではなくて、ピンポイントで指定したい!!

 

実は私、初めはこれに随分悩んでいました。データは自分でつくったから、データの場所はわかるから直接取りにいきたいのに、ループで条件分岐をかけて探すとか大変!!

直接取るとは、どういうことかと、、、、また絵でイメージすると、

f:id:hamochikuwa440:20210215105423p:plain

この絵のように「大阪府」データを取りたいときです。実はこれすごく簡単でした。

 

f:id:hamochikuwa440:20210215105835p:plain

このように変数にkeyを並べるだけです。これだけなんです。これで「大阪府」って表示されます。ここで唯一気をつけるのは、上の絵の表の「id」ではなく、表の左脇にある「key」を使うということです。これは配列に勝手についてくる通し番号みたいなものです。

「key」は基本0から始まります。1から始まることに慣れていると、よくずれることがあるのでコードを書くときは、しっかり理解しておかないといけません。

(参考:keyを始める数字は指定できますし、上のように直接指定するよりループ文で値を調べる方法のほうが一般的です。こちらは調べればすぐ出ますので割愛します)

 

 

その3 Excelみたいに行、列を削除したい

 

また、絵でイメージすると、、、

f:id:hamochikuwa440:20210215110932p:plain

これですね。消すだけなら実はすごい簡単で、、、

f:id:hamochikuwa440:20210215111126p:plain

あら、、、小さい(笑)。keyを指定すればその行が消えます。

 

で、列の削除です。   また絵を、、、

f:id:hamochikuwa440:20210215111256p:plain

はい、ダメなんです。レコードみたいにびよ〜んと横に伸びてるからでしょう。モグラ叩きみたいに消してくれても良さそうですが、さっきの短いコードのunset($data[1]);unset($data['age']); にしても消えません。困った。。。。。と思いきや、コードを書いていくとそのうちわかりますが、このデータは順番にでてきても「無視」することで影響は全く出ません!!どうしても消したいときは、ループで残したいデータを別の配列にいれるなどして、残った配列を消してしまうことで叶うでしょう。でもホントに無視でいいです。消えたと思って条件から外せば、問題ないです(笑)

 

 

その4 消したけど同じデータで戻したい。

これは戻せますが、順番が変わります。どうなるかというと、、、

f:id:hamochikuwa440:20210215112439p:plain

こんな感じになります。戻すコードは下のようになります。

f:id:hamochikuwa440:20210215112649p:plain

その1で出したコードの左辺の[ ]の中にkeyの番号を入れると同じkey番号で戻せますが、絵のように順番が最後になります。

検索の時に順番でなく、keyや値で検索すれば問題ないですが、順番に比べなくてはならないときもあります。そういったときは配列の並び替えを使えば解決です!並び変え方法もたくさんあるのでここでは割愛します!

ここで書いておいて申し訳ないのですが、実はこの書き方ですと、データのkeyを間違えて実行すると、もともとある大事なデータが上書きされ消えるリスクがあります。そのため、ループ検索して今あるデータと比べながら追加するのがやはり大事なんですね。比べた後にこの方法ならOKです。

 

 

その5 年齢だけ上書きできる?

 

次は、部分的に上書きできるか?ということです。

まず、こういうコードを書いたとして、、、

f:id:hamochikuwa440:20210215114132p:plain

['id']が2の豊臣さんの['age']['id']を入れてみます。指定しなければ、指定したところだけ反映されて、上書きされずに残るのか???と予想してみると、、、、

f:id:hamochikuwa440:20210215114011p:plain

残念ながら絵のようになります。

さらに、省略したところは、見出し列のkeyごと消えてしまいます。よく見出しkeyを指定して検索かけますが、消えてしまったkeyの列を使うと、エラーになってできなくなります。これはループを使って直接指定するのが安心か。。。。と、なんだ、できないのか、、、、とお思いの方、大丈夫です!実は、難しく考えずに、その2の方法が使えます!!

f:id:hamochikuwa440:20210215115521p:plain

これで豊臣さんは75になりました。

 

 

本来はループ(forとかforeachとかwhile)を使って、条件分岐(IFとかswitch)検索して、、、、とするのですが、結局、ループの中にいれるコードはこういった原始的な書き方になるので、知っておいてもよいと思います。配列って見えないので考えないようにしちゃいがちですが、使えるとExcelは不要になるぐらい便利です。また、ExcelVBAにも連想配列と同じ考え方があるので、ちょっと手間ですが、少し頑張って仕組みを構築すれば、ボタン一つで仕事が終わるようにできるかも?!ですね。

 

はじめて、自分の頭の中を書いてみました。ぐちゃぐちゃになってしまいましたが、少しずつ書きながらレベルアップを目指します。

 

長文でしたが、ここまでお付き合い頂きありがとうございます。