はもちくわ

コードについて書いていきます。

PHPとかMySQLとか全くわからなかった時に想像していた世界

web上でデータベースを使っていろいろ作らなければならなくなり、勉強を初めたばかりの頃、よくわからない言葉と仕組みのばかりで一度見るのをやめ、他の方法を、、、と思ったものです。何がどうなっているのか分からないわけです。

 

そんな私が、無理やり理解しようと、頭の中で想像した妄想世界をちょっとここで表現してみます。

 

間違ってるかもしれませんが、あくまで想像している世界ということで大目にみてください。

 

1.登場キャラクター

f:id:hamochikuwa440:20210227014002j:plain

f:id:hamochikuwa440:20210227014013j:plain

f:id:hamochikuwa440:20210227014028j:plain

f:id:hamochikuwa440:20210227014042j:plain

f:id:hamochikuwa440:20210227014058j:plain

f:id:hamochikuwa440:20210227014118j:plain

以上が登場する妖精の世界が「サーバー」というところで、どうやってwebページを作っているのかというと、、、、

 

 

f:id:hamochikuwa440:20210227014244j:plain

 

こんな感じなのかなと。。。

 

webページのPHPコードを初めて書いた時、なんでこんな順番なんだろう??ってよくわからないと思っていた時に自分を納得させた世界です(笑)

 

H・ブラックとC・レッドの妖精は、1回作った作品は記録もせずに捨てる。

何かの操作をP・ロボに頼むときは、作り直す前提。

JS・グリーンは止まっている時、自分から見に行かないとわからない。

P・ロボは開発環境はエラーONにしておかないと見えない。

 

などなど、、、こんなことは、初歩なのかもしれませんが、独学ではなかなか理解できませんでしたね。あと、SQLとかApacheとかも未だによくわからないところがある(笑)でも大体こんなイメージだと思います。それぞれの場所に、それぞれを動かすOSとかソフトみたいなものがあるイメージです。だから、ミケがいないと動かないし、ミケにもタンスにも変わりになる存在があるということです。

 

サーバー界を作った創造主(サーバー管理者)が持ってる妖精リスト(仕様)をみれば、どの妖精(システム)がいるかわかります。H・ブラック、C・レッド、JS・グリーンは比較的浅いところとにいると表現してますが、ブラウザに住み着いているという感じかもしれません。だいたい、3匹はどこでも使えますので。P・ロボにはグレード(バージョン)もあります。新しいほうがよく動きますよ。

 

ひょっとしたら、この説明で余計わからなくなることもあると思いますが、この世界観がすこしでも何か共感できる方がいると嬉しいなと思います。

【PHP】for文の定形以外の利用法

for文について今日は書いていきます。

私のプログラミングの入口はExcelVBAだったので、それと比べると同じforを使うループでも、PHPは「なんか自由だな。。。」と思ったので、今回それについて書いていきます。

 

まず、いろいろなページでfor文はループ回数が決まっているものに使いましょうという紹介が多くされていますね。

 

記述としては

for( $i = 0 ; $i < 5 ; $i++ ){
            〜処理〜 ;
} 

意味としては 

for( カウンターの始まりカウンターの終わり増減式  ){
  〜ループ処理〜 ;
} 

みたいな感じですよね。

具体的な動きを、上記の5回繰り返しコードでみていくと、

f:id:hamochikuwa440:20210223210815p:plain

 

となります。

第1式はループ前の初期設定で実行は1回だけ、第2式で判定し処理、最後に第3式実行です。なので結果は、0回目 1回目 ・・・4回目と0〜4まで5回処理されて終了します。

 

この第3式は増減式として考えられて、ここでは$i++($i=$i+1と一緒)と1つずつ値が増えてます。使い方はほぼこれですよね。

カウントアップの値を変更したいことが稀にあるぐらいで、その場合、「式」なので、$iの値を変える式を第3式に入れればよいわけです。

なので、

◆1ずつ減らしたければ
$i--
もしくは
$i = $i -1
◆2ずつ増やしたければ
$i+=2
もしくは
$i = $i +2
◆2倍で増やしたければ
$i*=2
もしくは
$i = $i *2

のように設定すればいいです。今回、省略式と一緒に普通の式もあげましたが、式の実行結果が大事なので、別に省略して書かなくてもいいわけです。

また、アルファベットなら次のようにカウントとして使うこともできます。

f:id:hamochikuwa440:20210223223818p:plain

これを実行すると、a回目〜g回目までの7回実行されます。

ただし、日本語は無限ループに入りますので注意が必要ですよ。

 さて、このへんまでは普通の使い方で、思ったとおりという感じなのですが、ここから紹介することが、「自由だな」と思ったことです。

 

このfor文なのですが、第1式〜第3式「どれでも省略可能」で、しかも、「カンマで式を追加」できるんです。

 

まず、式の追加から見ていきます。まず、配列データを表示しながら、データを消し、最後に変数の状態を表示するコードで見てください。

f:id:hamochikuwa440:20210223231014p:plain
(上の絵のforの前のゴニョゴニョは無視してください(笑))

 第1式にカンマで区切って、count($data)が入っているのがわかるでしょうか?ここに入れても普通に動くんですよ。

そして、ループごとに$dataの数が変わっていくコードになっています。第1式にcount( )でそのデータ数を調べていますが、実行結果はしっかり6回動いていることがわかります。

これで先程説明した第1式は初期設定、ループ前の1回だけしか処理してないことがわかりますね。やっていることは次のコードのように、ループ前に宣言することと同じということです。

f:id:hamochikuwa440:20210223225734p:plain

第1式にあえて入れる必要のある書き方が後々読み返しやすいコードになるのか?

というのは、ちょっと言い切れませんが、ループに関わる変数をループの初めに入れてしまう使いみちは、可能性があるかもしれませんね。

 

また、この話とは別件ですが、このサンプルは、ループごとに配列データを消して、データ数がループ中に変化してしまっています。そのため、よく配列検索ループで使う手法の第2式に

$i < count $data )

を入ると、ループのたびに配列データ数が減るので値が減っていくのに対し、$i++でカウントアップしてしまうので、期待する動きになりません。

 PHPマニュアルには、第2式にcount()を入れるとループのたびに、count( )を呼び出すことになるので、初回の1回実行の第1式に記述するほうが、処理が早いと紹介されています。なるほど、ループ数が多いときは検討すべきなのかもしれませんね。

 

そして、もう1つ。第1式から第3式まで式を入れた場合です。

f:id:hamochikuwa440:20210223231300p:plain

ちょっと複雑ですが、実行すると

 

$iは0 $jは10
$iは1 $jは9

 

と2行で処理が止まります。内容としては、

◆$iは
 0から始まり、5になったら終わり、1つずつカウントアップ。
◆$jは
 10から始まり、8になったら終わり、1つずつカウントダウン。

の2つが同時進行するわけですが、$jは式の命令どおり、「8になったので終了」でわかるのですが、$iがまだ条件に達していません。

「どちらかが条件になったら終わり」いわゆる「or」や「||」に見えますが、マニュアルを読むと第2式は「すべて評価するが、一番最後に書いた式で判断される」そうです。そのため、上のコードの第2式を下のように反対に

$j > 8 , $i < 5

と記述すると、$jは8になってもループは抜けずに繰り返し、$iが5になったら終わります。なので先程は2回で繰り返しが終わりましたが、今回は5回繰り返しが行われることになり、そのときは$jも一緒に処理され、6まで表示されるということになります。第2式では制限されなかったということですね。

 

このように、第2式は複数式書けますが、余り意味がないように思えます。

一方、第1式、第3式は、ループ中に別の変数もカウンターのように可変したい時などは複数式が使えそうです。

 

つぎは式の省略です。初期値も、評価式も、増減式もないループ。ご想像どおり、無限ループになります。ループの中でbreakを使って止める方法です。結局、whileやdo〜whileなどと同じような使いみちになりそうですが、この第1式、第2式、第3式はどう使ってもOKで、使うか使わないかも選べるので、うまくこの特性を使えば、自由なループを設計できる可能性はあります。

 

動きは想像できるかもしれませんが少し例をあげると、

f:id:hamochikuwa440:20210223233452p:plain

このようになります。また、ここで例は挙げてませんが、実際に使っていくことを考えると、第2式の評価式だけ使い、while文のように「値が0でないならループ抜ける」みたいな書き方が可能ですし、第3式だけ使い、繰り返し回数はわからないけど、繰り返しているときだけ式を実行させる時など利用方法はあります。ただ、思いつくやり方は、他のループ使えば解決しますね、、、、

あと、全く関係ないですが、、、for( ; ; )は可愛いかもしれませんね(笑)

 

そして、番外編です。式を使ってループしてくれるfor文ですので、こんな使い方もできるという例です。

今日から5日間を表示させるループです。

$today = new DateTime();
for($day = new DateTime() ; $today->diff($day)->d< 5 ; $day = $day->modify('+1 day')){
echo $day->format('Y年m月d日'),'<br>';
}

forの「数値」を使って、テキスト表記した方が早いんですけど、、、は言わない約束ですよ(笑)あとあとオブジェクトとして使えるし!、、、と思いましたが、使うときはその時宣言すれば解決しますな(笑)

 

実は、最初にサンプル書いた時は、第2式を

$day  < new DateTime ( '+5 day' )

としていたんですが、、、、比較するたびにオブジェクトを作成するありえないものになっていました。結果も6日分表示されてしまった。これやるなら、適当な変数に5日後のオブジェクトを作って、第2式で比較しないとダメでした。その方法ならうまくいきます。今回のサンプルはdiffで日付の差分を計算して評価する方法に変えました。

 

さて、今回はfor文でした。思ったより自由ではないでしょうか?

 きっと上手に組めばfor文は面白いループになるんでしょうね!

【PHP】foreachの「$key=>」ってなに?(multisortの使い方)

foreachは、配列に入っているデータ分ループして、データが終わると自動で止まってくれるとても便利な命令です。

サーバーのデータベースからPHPでデータ処理を行う時など、本当によく使いますが、PHPを扱い始めたばかりの頃は「 $key=> 」の意味が、よくわからず、記述しなくても配列のデータを取り出せるので、「 $key=> 」は記述せずに使ってました。最近やっと理解できたので、そのへんを整理して書いてみようと思います。

 

まず、foreach文の使い方です。

f:id:hamochikuwa440:20210223002900p:plain

上の絵は、連想配列で['id']と['name']のキーで準備された6つのデータを、foreach文を使って表示しています。上記のように、「$key =>」があるパターンと無いパターンがありますが、どちらも同じ結果です。

 

表示で違いを出すようにすると次のようになります。 

f:id:hamochikuwa440:20210223004007p:plain

echoに$keyを追加してます。そうすると、上の絵の赤い丸のところのように、表示されます。キーは配列の住所と私は理解していますが、そのキーが表示されるわけです。

 

ですが、配列の値をIF文で検索して、該当したら表示する、もしくは準備していた変数に入れて次の処理、という使い方が多いので、「キー使わないし、書き方も=>ってよくわからないし、無くても動くし、まあ書かなくてもいいか」と考えてました。

 

自分が理解してないコードを書いて、エラー出ても、後で見返しても分からないとなるとどうにもならないですからね。なので、配列の場所を調べたいときは、下のようなIF文で順番を調べて指定していました。

f:id:hamochikuwa440:20210223005421p:plain

特に配列の値や順番が変わらない固定的なものであれば、これで問題ありません。そのため、壁にあたるまではずーーーーっとこのめんどくさい方法をとっていました。

 

ただ、先に書いたように、「順番が変わらなければ問題ない」だけであって、配列はキーを維持したまま順番が変わることがあるのです。むしろキーを維持したまま変わるほうが私は多い。。。

 

キーを維持したまま、順番が変わることを再現するため、最初の配列データのキーを直接指定して変更し、上と同じコードで「徳川」さんをIF文で検索して表示させます。すると、次のような結果になります。

 

f:id:hamochikuwa440:20210223201555p:plain



キーが順番と違うので、検索した順番を指定して表示すると、結果が変わってしまいます。このように、条件によって結果が変わってしまうコードは、意図してない場合、とても困りますし、理解してなければ原因を調べるだけで大変な労力です。

 

そこで、ちゃんとforeachの「 $key=> 」を理解しようと考えました。そして、私が理解した命令文の解釈は下のようになります。

 

f:id:hamochikuwa440:20210223010358p:plain

こんな感じだと思います。配列を順番通りに取り出す命令で、繰り返すごとに必ずキーと値がセットでやってくる。なので、次のように書けば解決します。

 

f:id:hamochikuwa440:20210223010919p:plain

 

これで解決です。

そして、「$key =>」はよく連想配列のときに使うのように紹介されますが、普通の配列でも使えます。使い方は上の連想配列と同じですが、実際に書くと下のようになります。

 

f:id:hamochikuwa440:20210223011151p:plain

これで、カウンターをつけて検索しなくても、いつも値と一緒にやってきてくれるキーを使ったほうが楽になりました。

これ書きながら思ったんですが、foreach文のコードの説明のときは、だいたいキーを$keyで表しますよね。だから$keyが自由に名前が変更できる変数っぽくないから混乱するんじゃないですか?!だってコードの一部みたいですもん。

だからforeach( $data as $k => $d )でいいんですよ。

 

さて、ここまで、配列の並び替えを無視してやってまいりました。もちろん並び替えもできます。ここまで使ってきた$dataの配列をキーの順番に並び替えるなら、ksort($data)で昇順、krsort($data)で降順。値で並び替えるなら、asort($data)で昇順、arsort($data)で降順です。

しかし、データベースから持ってきた連想配列でカラムによって値がいくつかあるとき、asortって値での並び替えだけど、どのカラムが基準になるの?となりますよね。これは、並びが最初のカラムの値を基準にして変わるようです。上の配列なら['id']ですね。データベースからのデータなら、そもそもユニークな値のカラムがないと編集ができないので、大体はid作ってオートインクリメントにしたりしますよね。だから、その値を最初にくるように設計していれば、上の関数一発で解決する気がします。

 

ですが!最初にも書きましたが、どんな値が来ても想定した動きができるようになってないと、やはりちょっと怖いですよね。それに、Excelのフィルターとか並び替えのように、特定のカラムをキーにして並び替える需要も結構あります。最後にそんな並び替えをするための、array_multisort( )の解釈を紹介します。

 

array_multisort( )の使い方

 

f:id:hamochikuwa440:20210223020314p:plain

 

ちょっと複雑に見えますが、何をやっているのかと言いますと、連想配列$dataの['id']というカラムを指定して並び替えるという関数はなく、単独では解決できません。

そこで、array_multisort( )を使うのですが、並び替えのキーとなるカラムの情報を配列にする必要があります。

そのため、先に$dataから['id']のカラムデータを「別の新しい配列のコピーを作成」します。その方法として、上の絵の四角のように2通りありますが、array_columnはPHP5.5以降しか使えません。古いシステムで動いている場合は注意が必要ですね。。。

 

array_columnのほうがコードがスッキリしていて、見やすいですが、コピーを作成すると考えると、array_columnよりforeachで配列を作っている方が理解しやすいですね。$dataのキーと同じように['id']カラムデータから配列$idを作っているわけです。

 

そして、マルチソートを使い、先に作った$idを並び替え、$idのキーに習って$dataを並び替えるということをするわけです。

また、複数のカラムを指定することも可能です。その際は、指定するカラムごとに配列を準備する必要があります。このような複数指定するキーがある場合、array_columnのほうがコードがスッキリして良さそうですね。マルチソートのほうは、「コピーしたキーの配列」「並び替え基準」を元の配列の前に追加していけば使えます。

 

以上が、私なりの理解、解釈になります。すこし表現がおかしいかもしれません。いまのところ、このように考えて使っていて不具合はでてませんので、大丈夫だと思いますが、おかしなことがあれば、すぐに訂正していきます。

 

【PHP】TCPDFのMultiCellとTextの配置

2/17にアップしたコンビニ店長向けのシフト表ページに機能追加しました!

時間単位を15分刻みにして、出力するPDFサイズをA4とA3対応に変更。セルとフォントの大きさも設定できるものにしました。ブラウザ操作で下のようになります。データ入力は面倒なのでCSVファイルでアップロードも可能です。

f:id:hamochikuwa440:20210219150712p:plain

こんなふうにシフト表がブラウザ上に表示されたあとに、下の操作をすると、

f:id:hamochikuwa440:20210219151036p:plain

と出るわけです。

 

もっと、簡単に機能追加できると思ったんですが、「15分だけのシフト」の表示にとても困ったので、ここで紹介します。

 

PHPでPDF出力する「TCPDF」というライブラリを使っています。私は座標を計算させて配置していく設計をしてますが、座標計算は思った通りの挙動をしてくれるのでとても扱いやすいイメージです。

シフト表とは別に、履歴書作成ページもつくったのですが(私のページで個人情報入力はおすすめしませんが(笑))これもちゃんと動きます。JIS規格のA3で写真もリサイズ(縦だけですが、、、)してと、、、ちょっと話がずれたので戻します。

 

さて、困ったことというのは、

 

15分シフトが小さすぎてテキストが入らないということです。実際にどうなったのかといいますと、下のようなコードを書いて作成したところ、表示されない訳です。

 

f:id:hamochikuwa440:20210219152525p:plain



Excelさんだと、セルに合わせてフォントを縮小してくれますが、そんな便利な機能はついてないので、上の絵の水曜日の「橋本」さんのように自分で設定を組み込まねばなりません。私は15分区切を1マスとしてカウントし、3マス以下もしくは4マス以下で名前が4文字のときはフォントを半分にするという設定をしてます。

当然、表示されてない火曜日もフォントを半分にしてますが、小さすぎて表示されないようです。このMultiCellは座標指定もできて、自動折返しもしてくれる便利な命令なのですが、、、はみ出しでは使えないということですね。どうにか、はみ出してもいいので表記したい。

 

では、Cellという命令に切り替えて試してみます。MultiCellとCellは姉妹品みたいなものなのですが、引数の指定場所がちょっと違うので注意が必要です。(とても丁寧に説明をまとめてくださっている方がおりますので、「TCPDF」で検索してみてください。)

 

f:id:hamochikuwa440:20210219153515p:plain

 

残念ながら時間表記のところに改行されずに上書きされたようです。では、改行してみたらいいんじゃないか?ということで、表示前に改行してみます。

 

f:id:hamochikuwa440:20210219153950p:plain

 

改行しましたが、他にも影響を与えながら改行してしまいました。シフトデータを順番にセルで配置するループ内でやってますので、他にも影響がでるものは大きくコードを変えなければいけないので避けたい。。。そこで思いついたのが、小さいセルはテキストなしで塗り潰し表記して、その上からテキストを貼り付けるように表記する方法です。

長くなるので細かいコードの説明は省略しますが、MultiCellは改行する、しないを引数で判断してますので、X軸だけ$s_cell変数で与えてます。ですが、TextさんはしっかりX軸とY軸を与えないと意図しない場所に出ます。そのため、テキストが空のセルを表示したあと、現在地をGetY,GetXで調べて与えてます。

 

f:id:hamochikuwa440:20210219154725p:plain

 

すると、こんな感じで横に表示されました!これならX軸とY軸を調整すればいいじゃないということで、私の設定している変数のセル幅が$shift_w、高さが$shift_hなので、それっぽく計算いれて、X軸とY軸を調整してみます。

 

f:id:hamochikuwa440:20210219155523p:plain

 

なにか、私の計算した「セルの高さの半分」という、改行が入ってしまったようです。

 

こういう調整を解決させるのは苦手だな。。。と思ったとき、ひらめきました(笑)このシフト表はPDFに出力させているとき、TCPDFが作った$pdfの中でカーソルの場所もグリグリ動いています。ということは、表だけ作った後に、上から載せてしまおう!ということです。解決するとなんだそんなことか、、、というものかもしれませんが、思いつかなかったです。そこで、こんな設計で動かしてみました。

 

f:id:hamochikuwa440:20210224014928p:plain

 

ループ中に枡の小さいシフトが出たら、そこで表示解決させるのではなく、配列に情報をいれてひとまず棚上げします。そして、ループを抜けたら、料理の最後にのせるパセリのごとく、メモしておいた場所に名前を置きに行くと、、、結果は、

f:id:hamochikuwa440:20210219160425p:plain

 

ちょっとずれていますが、15分シフトはイレギュラーですし、きっちり収めないのもいいかな。ということでこれにしました。ですが、作成中に分岐が面倒になり、フォントの選択分岐は半分しか設定してないので、条件分岐をもう少し入れて、大きさも細かな設定をいれれば、もっと良さそうですね!!あと、フォントの出力のズレは、フォント自体の大きさを加味すれば解決しそう。。。お金取るシフト表作成ツールならそれは当然でしょうけど、これただ私が作っているだけなので、まあこんなものでしょうね(笑)

注意:最後のコードのフォント指定にMSPゴシックの指定がありますが、初期設定では無いです!自分で追加が必要です。Macなら瞬殺で設定できるのですが、Winはちょっと工夫が必要みたいですよ。

 

次はループの話か、$_POSTの話にしようかと思います。

 

コンビニ店長さん向け 1週間シフト表作成ページ

PHPを使ってブラウザで動くシフト表作成ツールを作りました!

 

時間の区切は朝6時から翌朝6時までです。本当にただ、シフト表をつくるだけなんですが、例えば深夜の22時から勤務開始して翌日ロングになるとか、深夜3時から翌日朝9時までとか、とにかくいろんなシフトがあって大変ですよね。あくまでシフト作成という観点なので細かな時間設定とかはまだ実装してませんが、まだ手書きで作っているならちょっと見てもらえると便利かな〜と思います。

 

基本動作は

・ブラウザ入力⇒出力⇒PDF作成

 

データのアップロードの場合は

csvデータのアップロード⇒出力⇒PDF作成

 

となってます。csvデータの作成ルールは細かくなってますのでページでご確認ください。ただ、お金かけずに作ったので、作成ページはフリーサーバーを使用してます。そのため、SSL通信ではございません。最低限のガードはいれていますが、それでもセキュリティーのことがあるので、データの入力に個人情報は入れないようにし、ログインしないと使えないみたいなガードもやめました。

本当に、ただ作るだけです。入力したもの、アップロードしたファイルもフリーサーバー容量をしっかり確保したいので保存は一切してませんし、できません!データベースにもつながずにやってます。

利用したときのデータのダウンロードはPDFにしたときのファイルのみです。(何か変な動きをするようならお問い合わせ頂ければ確認します。)

 

そんな感じのページですが、使ってもらえたらなと思っております。まだ実装してませんが、時間単位を15分、30分、1時間で選べるようにしたり、出力する用紙サイズを変更(いまはA4だけ)できるようにする予定です。

下記のURLから入れます。

http://taji440.php.xdomain.jp/shift_table/index.php

 

前の記事で書いた配列をグリグリ動かして作ったものです!

お金かけてしっかりサーバー管理したら、シフトを相互管理とかもできるんですが、私もそこまで無償奉仕はできないので、、、

 

【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

連想配列の削除イメージ

はい、ダメなんです。レコードみたいにびよ〜んと横に伸びてるからでしょう。モグラ叩きみたいに消してくれても良さそうですが、さっきの短いコードの[ 1 ]を ['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にも連想配列と同じ考え方があるので、ちょっと手間ですが、少し頑張って仕組みを構築すれば、ボタン一つで仕事が終わるようにできるかも?!ですね。

 

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

 

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

プログラミングで仕事したい

サービス業で20年勤務してきましたが、やりたいことが違ったみたい。。。

いまはプログラミングがとても楽しい。もういい年齢でいまさら感がハンパないですけど。

 

英語も難しい用語もすごく苦手だけど、やりたいことがスルッと出来る感覚はなんとも言えない達成感があります。

 

「プログラミングで仕事したことないやつが何言ってるの?」と思いますが、とりあえず、やれることはやれるだけやってみて、チャレンジしようと思いました。

これからコードたくさん書いて、気がついたことをここでアップし続けてみようかと思います。

 

仕事になればいいな。