忙しい人のためのPHP小話

年齢計算、郵便番号から住所、住所から郵便番号、英語の数字表記等について小話的なものを。

年齢計算

年齢 = ( 今日の日付 – 誕生日 ) / 10000

住所から郵便番号

郵便番号から住所

多分、定期的に郵便局のサイトからデータをダウンロードして、csvを読み込むのが一番正しいだろうけれど、忙しい人はgoogleMapApiからでどうでしょうか?
フジテレビとか、東京都庁とかは住所が出てきません。しかし緯度経度はわかるので、地図とか入れるのは便利です。詳細は$decordの中身を見てもらうとわかります。
まぁ上のプログラム例を改良して郵便番号を抜ければ、

までが住所ですね。まぁそれは別として、GoogleMapApiではこんな感じです。色々と改良する余地ありです。jsonで取得してるのですからjQueryでもできますね。そっちのが楽だったりして。

英語の数字 thとかrdとか

これ実は海外のサイトで見つけたんですが、意味がわかりやすいように直しました。
元々は三項演算子なんかが使われててもっとスマートに書かれています。

忙しい人のためのと銘打って、もっといくつか載せようとしたのですが、だんだん面倒くさくなってここまでにしました。
第二弾があることを願いつつ、上の解説でもしようかと思います。

英語で数字は 1st、2nd、3rd・・・と言うように数えていきます。4~10まではthなのですが、11から 11stになればよいものを eleven thなんて言うもんだから、11stは間違いで、11thなんですね。12はtwelve thなので12thで、13もthになります。ということは20までthなんです。
で、21からまた21st・・・と面倒くさい。100は one-hundred、101はone-hundred-1stとさらにややこしくなります(笑)

ひとつずつswitchで、やってもよいのですが、

数が少なければこれでよいものの、100を超えてくるような場合はいちいち書くのもめんどくさい。で、先ほどのユーザー関数を使うわけですね。
$test_aと$test_cと2つありますが、なぜこれがあるかというと、先ほど解説した11th~20thの話で出てくるんです。
3以上21までの数字では100で割ることで(余りを計算することで[%の部分])、11th~20thを実現しています。まず3~21の数字かどうかを調べて、余りが1以下であれば、つまり0ならthが付き、すでに0はチェックしているので、0以上2以下、つまり1の時はstが付きと言う感じで3まで調べて、それ以上はthなんだよと言う構造になっています。

こういうのを、僕より面倒くさがりは一挙にしてしまうらしく、なんだか複雑なように思える三項演算子を使っちゃうんですね。
結局、elseifを続けて書いているわけですから同じことなんでしょうけれど、その昔のメモリに限りがあるPCなんかでは、文字1つですら何とかならないかと言う事で、一見複雑とも思える式を作り出したんだろうと想像します。

何をしているのかがわかりやすい方が色々といじれるので、後から見てこれ何してんだろ?と思わなくて良い分いいのかもしれませんが、一挙にできるのであれば、それはそれで良いのかもしれません。お好きな方でって感じですね。

それより一番最初の年齢のやつ。
これはなかなか優れ物です。普通、今日から誕生日を引けば年齢が出てくるというのはわかります。そうなるとdate関数とか使おうとする所を、そんなもんいらないよって感じですから素晴らしい。

例えば1980/10/18誕生日の場合、今が2013/10/19ですから電卓で、(20131019 – 19801018) / 10000 すると、33.0001が出てきて、(int)で整数部分だけ抜き出しているわけですからこの人の年齢は33歳とわかります。明日になって誕生日が来れば下4桁は同じになるわけですから2013-1980で33歳とわかります。
ただし、まだ日が変わってないので厳密には32歳なんですが満で表現するか数えで表現するかの違いでしょうか。日付が変わるのを基準するのであれば時間も考慮しないといけないので24時間分を-1することで表現できます。数えで言うならそのままでも良いですね。

date関数を使えば時間も考慮できますから日付が変わった瞬間、33歳とすることができます。
(1行目で今日を出すのにすでにdate関数使っているというのは内緒です)
例えば、

こういう感じでしょうか。
結局24時間分入れてるので+1してるわけですよね。もう誤差ってことで、ほぼ33歳って事にしてもらえると助かります。

あるいは、33歳と言うのは予定と考えて、32歳から33歳になる時にプログラム的に24時間のカウントダウンをするという手もあります。日付が変わる前の日にすでに年齢は変わっているわけですから、変わったところから24時間のカウントダウンが始まって、0になったら33歳おめでとうと表現することもできます。

もっと言うなら、余りがあるうちは32歳でジャストで割り切れた時、初めて33歳おめでとうと言うこともできますね・・・。
えぇ、date関数でもできますけれども。24時間カウントダウンというより5分前からとかでもできますけれども・・・、ただまぁ色々考えられるということです(笑)

普通、誰かに西暦を聞いて19xx年がわかれば、それを今日から引いて年齢を計算しますよね。それと同じような感覚です。正確さを求めすぎるのはお固い事務的なプログラムでの話。-1するかそのままかは、だいたいでいいんじゃないでしょうか(笑)

allabout48g(仮)通常版ではAKB等のメンバーの年齢計算に、

こういうのを使ってました。まぁやってることは同じですね(笑)

スポンサーリンク

シェアする

フォローする