tetsunosukeのnotebook

tetsunosukeのメモです

PHPを良く知らない人がPHPを語るときは気をつけたほうがいいかもしれない

まあ、いろいろ思うところがあって。

その1 PHPのソースをブログに貼り付けるためにタグとかを変換するツールをちょいっと作ってみた。

ちなみに、作ってあげた人のコメント欄で、タグの自動変換は<じゃなくて、<のように実体参照にすべきでは?という意見がありました。

うん。そのとおりだと思う。

ちなみにPHPにはコマンドでそれ相当のことをしてくれるコマンドがある。それはphp.exeそのものなのだが。だからあえていちいち作る必要は、そういう意味ではない。

たとえばこんなコード(temp.php)を、

<?php
    echo "hello, world";
?>

こんな風にしてくれちゃうわけ。関数のハイライトとかもやってくれる。(ある意味そこがおせっかいなのだが)

php.exe -s temp.php

<code><span style="color: #000000">
<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">echo&nbsp;</sp
an><span style="color: #DD0000">"hello,&nbsp;world"</span><span style="color: #0
<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code>

だから実際はあえて作る意味なんてほぼなかったんだ。
今までのスタイルを踏襲させるために作ったんだ。

ちなみに実際はこんな感じでどーだろうか。

<?php
// ファイルを仮に変数に読んだとして
$file = "temp.php";

$contents = split("\r\n", htmlentities( file_get_contents($file) ) );

foreach( $contents as $key => $value ) {
    printf("%2d . %s<br>\n", ++$key, $value);
}
?>

その2 ループ内のcountについて

他の言語もそうなんだと思うんだけど

for($i=0; $i < count($array); $i++) { ... } 

みたいなコードはどうにかならんのかね。こういう入門書が多くてガチで困る。

ループの中でcountという関数を呼ぶと、その関数が毎回処理されてしまうので、その時間がかかる。

これが1〜100000までの配列を生成して和を求めるループを計測したベンチマーク(PEAR::Benchmark_Timer利用)

----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1197594037.30534200   -                0.00%
----------------------------------------------------
Stop    1197594037.38918500   0.083843       100.00%
----------------------------------------------------
total   -                     0.083843       100.00%
----------------------------------------------------

こっちがcountをfor内部で呼んだ場合にかかる時間。

----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1197594065.16430400   -                0.00%
----------------------------------------------------
Stop    1197594065.28901400   0.124710       100.00%
----------------------------------------------------
total   -                     0.124710       100.00%
----------------------------------------------------

明らかに後者の方がコストがかかる。

なので

$cnt = count($array);
for($i=0; $i < $cnt; $i++) { ... } 

を推奨。