for ($i = 'a'; $i <= 'z'; $i++)
echo"$i
";
此代码段提供以下输出(换行符替换为空格):
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex... on to yz
PHP不是C,即使语法试图说服你相反。
这对我来说有一个非常小的变化:for($ i ='a'; $ i!='aa'; $ i ++){echo"$ i n"; }
关于PHP的评论不是C - 是最热心的例子:在c:char c ='a';与php中的不一样:$c = 'a';,重点在于C中有char类型(字符1符号),但在PHP中则不然,如果U告诉PHP $c = 'a'; - 意味着这是一个只有1的字符串字符。这就是为什么U不能在PHP中充分循环28个字符的原因。我希望每个程序员都能学习低级语言和强类型,而不会忘记数学实践,这将有助于他们变得更强大。
哇,真的很酷,但为什么它没有停在"z"
有关通过使用相等(==或!=)获得预期终点的方法,请查看相关问题的答案。
如果我是解析器,当我看到像'a'++这样的表达式时,我会抛出一个致命的错误
@zeusakm:char不是"字符"或"符号"(尽管字面文字提供了错觉);它是一个整数。这非常重要。
来自文档:
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's.
For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ).
Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.
来自评论: -
还应注意,<=是字典比较,因此'z'+1 ≤ 'z'。 (因为'z'+1 = 'aa' ≤ 'z'。但'za' ≤ 'z'是第一次比较为假。)例如,当$i == 'z'工作时会中断。
这里的例子。
哈......真是太疯狂了!我一直用ord()因此我从未注意到这一点。
为了完整起见,您还应该补充说"<="是词典比较,所以'z'+1≤'z'。 (因为'z'+ 1 ='aa'≤'z'。但是'zz'≤'z'是第一次比较是假的。)例如,当$ i =='z'可以工作时断开。
就像ShreevatsaR所说的那样,它是比较器,而不是麻烦的算法,不关注++运算符
@ShreevatsaR:实际上,'yz'+ 1 ='za'。失败的第一个比较是'za'<='z'
谢谢你们的评论!是的,关键点是'aa'在词典上小于'z',这就是循环继续的原因。并且它在'yz'上停止,因为'za'大于z。检查此示例。
在PHP'z'+ 1;是1,不是'aa'但是如果$ a ='z'; $ A ++;然后$ a =='aa'codepad.org/SnjELFxD
因为一旦达到'z'(并且这是你范围内的有效结果,$ i ++将它按顺序递增到下一个值),下一个值将是'aa';按字母顺序排列,'aa'是
for ($i = 'a'; $i != 'aa'; $i++)
echo"$i
";
奇怪的是'z'++ ='aa',但是'aa'
@Matthew:将它们按字母顺序排列。 'aa'将首先出现,因此它"小于"字符串'z'。循环终止于'zz',因为它按字母顺序"大于"(后跟)'z'。从某种意义上说,你可以"增加"某些东西并获得较低的价值,这是不合逻辑的,但从字母意义上讲它是合乎逻辑的。
字符增量器是Perl逻辑(参见CMS的文档引用)。比较'aa'
@eldarerathis哦,我完全明白它是如何工作的。我只是在同一时间发现它很奇怪。
@Matthew:啊,骗了。误解了你的评论。
这对我来说非常有用,可以使用遵循相同逻辑系列的Excel列
@Artefacto - 我不会在该结构中使用<=或> =运算符,因为我认为它们纯粹是算术运算符。我真的希望减少也得到支持,这将是非常有用的,支持非英语语言会产生一些非常有趣的逻辑。我很想看到核心PHP开发团队的思想自发爆炸,如果有人建议应该:)
我首先想到的是@Mark Excel。我想知道是否还有其他可能有用的案例?
@Matthew Vines:我不能充分评价你的评论。是的,我同意。
@eldarerathis:但为什么要停在zz?而不是za?还是zzz?而不是zzzzzzzzzzzzz ...
@dbkk -"Battleships"游戏使用带有字母alpha引用的网格,所以还有另一个例子
@ acidzombie24 - 它将停在'za'因为'za'>'z',这就是'yz'是OP输出中最后一个打印值的原因
@ acidzombie24:我的意思是马克贝克指出的'za'。这是一个我没注意到的拼写错误>。>
其他答案解释了所发布代码的观察行为。这是一种做你想做的事情(它的代码更清晰,IMO):
foreach (range('a', 'z') as $i)
echo"$i
";
响应ShreevatsaR关于范围函数的评论/问题:是的,它产生"正确的端点",即传递给函数的值在范围内。为了说明,上面代码的输出是:
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
range()是否包含正确的端点?从其他语言的经验来看,这也是出乎意料的!
@ShreevatsaR:是的,range()给出了"正确"的端点,请参阅我编辑的答案(并点击该功能的链接)以获取更多信息。
我能说什么...更多PHP疯狂。 :-)没有其他语言我知道range()以这种方式工作。 (当然不是,比方说,Haskell或Python。)Dijkstra没有写过这个吗?
疯狂是PHP的不一致。 范围('A','CZ')与++ incrementor的工作方式完全不同,结果数组只包含三个值:A,B和C.
其他人已经说过为什么PHP没有显示你的期望。以下是您获得所需结果的方法:
for ($i = ord('a'); $i <= ord('z'); $i++)
echo chr($i);
?>
不必要。你根本不需要做ord(),只需要正确的比较来终止循环
@Mark,我更喜欢简洁易懂的代码。
+1当不熟悉PHP的一个更古怪的功能时,更容易理解。
这是自我记录代码的一个很好的例子。很容易理解b / c它使用序数值然后将变量显示为一个字符。如果最大值的测试仅确定如下一次,则for循环将更有效:"for($ i = ord('a'),$ max = ord('z'); $ i <= $最大; $ i ++){"
为什么不使用range('a','z')?
试试这个代码。我认为这段代码对您有所帮助。
$alphas = range('A', 'Z');
foreach($alphas as $value){
echo $value."";
}
按顺序显示26个字母。
这也可以使用:
for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1))
echo"$i
";
PHP具有循环字母的功能,可以超出单个字符;其余的将以这种方式完成:aa ac ... zz,依此类推。
试试这个:
for ($i = 'a'; $i !== 'aa'; $i++)
echo"$i
";
?>
$i = 'a';
do {
echo ($j=$i++),"
";
} while (ord($j) < ord($i));
?>
PHP不认为'AA'小于'Z'。
最好的方法是:
for($i = 'a'; $i != 'aa'; $i++) {
echo $i;
}
ABCDEFGHIJKLMNOPQRSTUVWXYZ
也许这段代码可行。它很容易理解:
$ascii_val = ord("a");
for($i=$ascii_val;$i
echo chr($i)."
";
}
?>
其中26是字母表中的字母总数。
虽然上面的答案对正在发生的事情很有洞察力,但非常有趣(我不知道它会表现得像这样,并且很高兴看到原因。
最简单的修复(尽管可能不是最有意义的)只是将条件更改为$ i!='z'
for ($i = 'a'; $i != 'z'; $i++)
echo"$i
";
?>
请注意,这只会给你一个y,而不是z
卫生署! 是的,好点。 我可以看到增量和比较背后的逻辑,但有时候$ a ++
哇我真的不知道这个,但它不是一个很大的代码你可以尝试回应"z"循环马克是绝对正确我使用他的方法,但如果你想要替代,那么这也可以你尝试
for ($i ="a"; $i ="y"; $i++) {
echo"$i
";
if ($i =="z") {}
}
echo"z";
?>