だから変数に入れてからループ回せって話
先日RedLine Magazine : 簡単なお知らせを表示する(1)を書いたときに疑問だったことをメモってたんだけど、それに対して「こうだから変数に入れた方がいいと思うよ」っていうのをTwitterのお友達、reaさんに教えていただきました。
疑問だった内容、該当ソースはこんな感じ。
$news_list = file($data_file);
$news_num = count($news_list);
for($i = 0; $i < $news_num; $i++){
処理内容
}
$news_num = count($news_list);の部分について
「$news_num = count($news_list);」は別に変数に入れなくてもforの「$i < $news_num;」の部分を直接「i < count($news_list);」にしてもいいんかな
っていうのが疑問だった。どっちでも結果は同じだし。その時は変数に入れた方が分かりやすいかなーとか漠然と思ってた。
変数に入れた方がいい理由
結論から言うと、これは変数に入れて正解だったみたい。rea先生の教えによると、for文に直接 count($news_list) を入れても動くけど、ループが回るたびに$news_listの個数を数えるので効率が悪い
とのこと。
それに対して、いったん変数に入れておくと、ループのたびに数える必要がないのでサーバーへの負荷が減らせる
。だから変数に入れるのだよ、と。
なるほどーーーーー!って思った。言われてみれば確かにそうですよねって感じだけど、count($news_list)が毎回ループのたびにカウントしてるなんて・・・言われなきゃ一生気づいてなかった。ありがとうございます。
但し、PHPのようなサーバーサイド言語の場合、サーバー側で$news_listの個数をキャッシュしている場合もあるよ、とのこと。(これは変更できるらしい)Javascriptの場合はこの一旦変数に入れる処理をするかしないかでかなり差が出るらしい。特に某ブラウザで。
どちらにせよ、こんな知識をゲットしたので、絶対今後一生支障ない時はループん時、変数に入れるぜぃ。
また賢くなった。嬉しい。ヽ(´ー`)ノ
追記:こんな書き方もできる!
さらにさらに、rea先生からこんな書き方もできるよ、と伝授して頂きました。
for ($i = 0, $news_num = count($news_list); $i < $news_num; $i++) {
//処理内容
}
今回の私の疑問のように、ループを回すためだけに変数に count($news_list) のようなものを代入する時には上記のようにfor文に関する処理をfor内に収めるっていう書き方ができるんだって。こういう風にひとまとめにしておくと、後々管理がらくなのかもなぁと思いました。rea先生曰く、「ちょっと見にくくはなりますが」とのことですが、なんかプロっぽくていい感じです(n'∀')η
ちなみに初期化する時にカンマ区切りにすれば複数指定が可能とのこと。javascriptも同じ書き方をするそうです。またまたまたまた賢くなった!
<< SimpleXML関数使ってフィード読み込みたい | PEAR::Authで認証してみたい >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/224
コメント (2)
どうも、reaです。
JavaScriptの結果ですが、参考までにどうぞー。
http://hisasann.com/housetect/2008/08/arraylength.html
投稿者: rea | 2009年02月09日 15:42
>rea先生
いろいろありがとうございますー。
リンク先、拝見しました。
数字で見ると「おおお!」って思いますね。自分は何万回もループを使う事が今後あるのかないのかわからないけどwww
なんだか勉強が非常に楽しくなってきました。仕事したくないww
投稿者: Red | 2009年02月09日 21:11