会社で楽しかった瞬間。
今日、ふと、ある人力検索はてなを見ていたら、こんなものを発見した。
PHPのコードを教えてください。…で、回答を見ていたが、すっきりしない。スマートって書いてあるのにだ。
せっかくなので、回答しようと思ったが、すでに締め切られていたので、自己満足で書いてみた。
問題文:
PHPのコードを教えてください。なるべくスマートな方法が良いです。表を数字1から100まで10行*10行作りたいと思っています。1~10までいったら次の行、11~20までいったら次の行というように作成したいとおもっています。
<?php
for($x=1;$x<=10;$x++){
print "<TR>";
for($i=1;$i<=10;$i++){
print "<TD>$i</TD>";
}
print "</TR>";
}
?>
と書くと10行*10行の表は作れるのですが、1~10までのものが10行できてしまいます。これを1~100までの数字を10行*10行にどのようにすればよいでしょうか?
あ、ちなみに、中括弧一つ補っておいたw
で、出てきた回答がこれ。
<?php
$k=1;
for($x=1;$x<=10;$x++){
print "";
for($i=1;$i<=10;$i++){
print "$k";
$k++;
}
print "";
}
?>
もう一つ
<?php
$x = 1
for($i=1;$i<=10;$i++){
print "<TR>";
for($j=1;$j<=10;$j++){
print "<TD>$x</TD>";
$x++;
}
print "</TR>";
}
?>
いや、なんか書きたくなるでしょ?というわけで、まず自分で作ったのがこれ。
<?php
$tds = array_map(create_function('$td', 'return "<td>$td</td>";'), range(1, 100));
foreach (array_chunk($tds, 10) as $td) {
printf("<tr>\n%s\n</tr>\n", implode("", $td));
}
?>
ちょっとすっきりしているね。array_mapとcreate_functionを使って行を作ってarray_chunkして列を10に抑えている。会社で似たコードを見たことがあって、試してみたかったのだ。で、ちゃんと動く。
で、同僚のSさんに聞いてみたところ、こんなコードが返ってきた。
php -r 'foreach (range(1,100) as $x) {if ($x%10 == 1) echo "<tr>"; echo "<td>$x</td>"; if (!($x%10)) echo "</tr>\n";}'
で、他の同僚のYさんに聞いてみたところ、こんなコードが返ってきた。
php -r 'foreach (range(0,9) as $x) { echo "<tr>"; foreach (range(0,9) as $y) echo "<td>".($x*10+$y+1)."</td>"; echo "</tr>\n"; }'
うーん、いいねー。しかし、ワンライナーですか。。というわけで、最初に私が考えたものもワンライナーで書いてみることにする。
php -r '$tds = array_map(create_function("\$x", "return \"<td>\$x</td>\";"), range(1, 100)); foreach (array_chunk($tds, 10) as $td) printf("<tr>%s</tr>\n",
implode("", $td));'
うーん。エスケープするところがイマイチ。。。
しかし、SさんやYさんのように、こんなことで、簡単なコードを書いて見せ合うことができる環境はなかなか楽しかったです!私の会社も悪くないなー。
他のPHPerな方だったら、どんな書き方するかなー。


PHPで1から100を表示…
PHPで1から100の数字を表示するコードをスマートに書くネタがGANCHIKU.comで紹介されていました。
他のPHPerな方だったら、どんな書き方するかなー。
(more…)