为什么这段代码不能简单地打印字母A到Z?

时间:2010-11-04 15:36:32

标签: php

<?php
for ($i = 'a'; $i <= 'z'; $i++)
    echo "$i\n";

此代码段提供以下输出(换行符替换为空格):

  

abcdefghijklmnopqrstu vwxyz aa ab ac ad ae ag ag a a a a a a a a a a a a ap a a a a a ap ap a a a a a a a a a a a a a a a a a a a a b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b 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 dd d d d d d d d d d d d d d dq dr d d d d d d d d d d d e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e ex ex ... on yz

14 个答案:

答案 0 :(得分:341)

来自docs

  

PHP在处理字符变量而不是C的算术运算时遵循Perl的约定。

     

例如,在Perl中'Z'+1变为'AA',而在C 'Z'+1中变为'['ord('Z') == 90ord('[') == 91)。

     

请注意,字符变量可以递增但不会递减,即使只支持纯ASCII字符(a-z和A-Z)。

<强> From Comments:-
还应该注意<=是词典比较,所以'z'+1 ≤ 'z'。 (自'z'+1 = 'aa' ≤ 'z'起。但'za' ≤ 'z'是第一次比较为假。)例如,$i == 'z'可以解决。

Example here

答案 1 :(得分:122)

因为一旦达到'z'(并且这是你的范围内的有效结果,$ i ++将它按顺序递增到下一个值),下一个值将是'aa';按字母顺序排列,'aa'是&lt; 'z',所以比较从未得到满足

for ($i = 'a'; $i != 'aa'; $i++) 
    echo "$i\n"; 

答案 2 :(得分:98)

其他答案解释了所发布代码的观察行为。这是一种做你想做的事情(而且代码更清晰,IMO):

foreach (range('a', 'z') as $i)
    echo "$i\n";

回应ShreevatsaR关于range函数的评论/问题:是的,它产生“正确的终点”,即传递给函数的值在范围内。为了说明,上面代码的输出是:

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

答案 3 :(得分:35)

其他人已经说过为什么PHP没有显示你的期望。以下是您获得所需结果的方法:

<?php
for ($i = ord('a'); $i <= ord('z'); $i++)
    echo chr($i);
?>

答案 4 :(得分:22)

为什么不使用range('a','z')

答案 5 :(得分:4)

试试这段代码。我认为这段代码对您有所帮助。

$alphas = range('A', 'Z');
foreach($alphas as $value){
    echo $value."<br>";
}

依次显示26个字母。

答案 6 :(得分:2)

<?php

$i = 'a';
do {
echo ($j=$i++),"\r\n";
} while (ord($j) < ord($i));

?>

答案 7 :(得分:2)

PHP具有循环字母的功能,可以超出单个字符;其余的将以这种方式完成:aa ac ... zz,依此类推。

试试这个:

<?php
for ($i = 'a'; $i !== 'aa'; $i++)
    echo "$i\n";
?>

答案 8 :(得分:2)

这也可以使用:

for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1))
    echo "$i\n";

答案 9 :(得分:0)

虽然上面的答案对正在发生的事情有深刻的了解,而且非常有趣(我不知道它会表现得像这样,很高兴看到原因。

最简单的修复(尽管可能不是最有意义的)只是将条件更改为$ i!='z'

<?php
for ($i = 'a'; $i != 'z'; $i++)  
    echo "$i\n";
?>

答案 10 :(得分:0)

也许这段代码可行。它简单易行可以理解:

<?php
$ascii_val = ord("a");
for($i=$ascii_val;$i<$ascii_val+26;$i++){
echo chr($i)."\n";
}
?>

其中26是字母表中的字母总数。

答案 11 :(得分:0)

PHP不考虑&#39; AA&#39;小于&#39; Z&#39;。 最好的方法是:

for($i = 'a'; $i != 'aa'; $i++) {
  echo $i;
}

ABCDEFGHIJKLMNOPQRSTUVWXYZ

答案 12 :(得分:0)

有几种方法可以做到这一点。

1. 首先,您可以取从“a”到“z”的范围。然后对其进行循环。

foreach(range('a', 'z') as $i)
{
    echo $i . "\n";
}

2. 您可以使用字符的 asci 值打印字母。

for($i = 97 ; $i<=122; $i++)
{
  echo chr($i) . "\n";
}

3.你可以取'a'的asci值并运行一个循环直到'z'的asci值:

for ($x = ord('a'); $x <= ord('z'); $x++)
{
    echo chr($x) . "\n";
}

4. 要在 html 中打印新行,您可以将
附加到每个字符的末尾。

for($i='a';$i<='z';$i++)
{
    echo $i. "<br />"; 
}

答案 13 :(得分:-3)

哇我真的不知道这个,但它不是一个很大的代码,你可以尝试回应“z”循环马克是绝对正确我使用他的方法,但如果你想要替代,那么这也可以尝试

<?php
for ($i = "a"; $i = "y"; $i++) {
    echo "$i\n";
    if ($i == "z") {}
}
echo "z";
?>