halka-tech

技術的なことを書きます

for文の初期値と終了条件に文字を入れた

a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk
abcdefghijkl
abcdefghijklm
abcdefghijklmn
abcdefghijklmno
abcdefghijklmnop
abcdefghijklmnopq
abcdefghijklmnopqr
abcdefghijklmnopqrs
abcdefghijklmnopqrst
abcdefghijklmnopqrstu
abcdefghijklmnopqrstuv
abcdefghijklmnopqrstuvw
abcdefghijklmnopqrstuvwx
abcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz

こんな感じに文字列の追記をしたいなと思って書きました。

<?php
for($c='a';$c<'{';$i++){
 $c=$c.$i;
 echo "$c\n";
?>

for文の初期値に文字が使えたんですね。
perlもそうらしいですね。
zまで表示させるために、終了条件をaciiコード表で見たzの次の"{"にしたんですが、ダメだったので調べてみると

PHP は、算術演算子で文字変数を扱った場合に C ではなく Perl の慣習に 従います。例えば、perl では 'Z'+1 は 'AA' を返しますが C では 'Z'+1 は '[' ( ord('Z') == 90, ord('[') == 91 ) を返します。 文字変数はインクリメントされることは可能ですがデクリメントは不可能であるということ、 またプレーンな ASCII 文字 (a-z および A-Z) のみがサポートされるということに注意しましょう。
加算子/減算子
http://search.net-newbie.com/php/language.operators.increment.html

とのことなので、"{"は使えないことになりますから、終了条件を$i<='z'だとか$i=='z&にしてみますがダメでしたし、$i<'z'+1にすると無限ループに入ってしまいますし、なんかもう面倒臭いので黙って初期値と終了条件をasciiコードで表現して、変数に格納する時にaciiコードから文字に変換するようにしました。

<?php
for($i=0x61;$I<0x7b;$i++){
 $c=$c.ord($i);
 echo "$c\n";
}
?>

ちゃんとできました。よかったですね。