为啥这段代码不简单地打印字母 A 到 Z?
Posted
技术标签:
【中文标题】为啥这段代码不简单地打印字母 A 到 Z?【英文标题】:Why doesn't this code simply print letters A to Z?为什么这段代码不简单地打印字母 A 到 Z? 【发布时间】:2011-05-05 03:26:07 【问题描述】:<?php
for ($i = 'a'; $i <= 'z'; $i++)
echo "$i\n";
这个 sn-p 给出以下输出(换行符被空格替换):
abcdefghijklmnopqrstu vwxyz 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 的评论是最激烈的,例如:in c: char c = 'a';与 php 中的不同:$c = 'a';
,关键是在 C 中有 char 类型(字符 1 符号),但在 PHP 中没有,如果你告诉 PHP $c = 'a';
- 表示这是一个只有 1 的字符串特点。这就是为什么 U 不能在 PHP 中充分循环 28 个字符的原因。我希望每个程序员都可以学习低级语言和强类型,同时不要忘记数学练习,这将有助于他们变得更强大。
哇这真的很酷,但是为什么它没有停在“z”
通过使用相等(==
或 !=
)check out this answer to a related question 获取预期端点的方法。
【参考方案1】:
来自docs:
在处理字符变量而不是 C 的算术运算时,PHP 遵循 Perl 的约定。
例如,在 Perl 中,
'Z'+1
变成'AA'
,而在 C 中,'Z'+1
变成'['
(ord('Z') == 90
,ord('[') == 91
)。请注意,字符变量可以递增但不能递减,即使如此,也仅支持纯 ASCII 字符(a-z 和 A-Z)。
From Comments:-
还需要注意的是<=
是一个字典比较,所以'z'+1 ≤ 'z'
。 (因为'z'+1 = 'aa' ≤ 'z'
。但'za' ≤ 'z'
是第一次比较为假。)例如,当$i == 'z'
起作用时中断。
Example here.
【讨论】:
哈..这太疯狂了!我一直使用ord()
,所以我从来没有注意到这一点。
为了完整起见,您还应该添加“
正如 ShreevatsaR 所说,麻烦的是比较器,而不是算术,不要专注于 ++ 运算符
@ShreevatsaR:实际上,'yz'+1 = 'za'。第一个失败的比较是 'za'
感谢 cmets 的各位!是的,关键是'aa'
比lexicographically 小'z'
,这就是循环继续的原因。它在'yz'
上停止,因为'za'
大于z
。检查this example。【参考方案2】:
因为一旦达到“z”(这是您范围内的有效结果,$i++ 会将其递增到顺序的下一个值),下一个值将是“aa”;并且按字母顺序,'aa' 是
for ($i = 'a'; $i != 'aa'; $i++)
echo "$i\n";
【讨论】:
奇怪的是,'z'++ = 'aa',但 'aa' @Matthew:按字母顺序排列。 'aa' 会先出现,因此它“小于”字符串 'z'。循环在“zz”处终止,因为它按字母顺序“大于”(在)“z”之后。从某种意义上说,您可以“增加”某些东西并获得较小的值,这是不合逻辑的,但从字母顺序来看它是合乎逻辑的。 字符增量器是 Perl 逻辑(请参阅文档中的 CMS 引用)。比较 'aa' @eldarerathis 哦,我完全理解它是如何工作的。我只是同时觉得这很奇怪。 这对我来说非常有用,可以玩弄遵循相同逻辑系列的 Excel 列【参考方案3】:其他答案解释了观察到的发布代码的行为。这是做你想做的事情的一种方法(它是更简洁的代码,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
【讨论】:
range() 是否包含正确的端点?从其他语言的经验来看,这也是出乎意料的! @ShreevatsaR:是的,range() 给出了“正确的”端点,有关更多信息,请参阅我编辑的答案(并点击该函数的链接)。 我能说什么……更多的 PHP 疯狂。 :-) 我不知道 range() 以这种方式工作的其他语言。 (当然不是,比如 Haskell 或 Python。)Dijkstra 没有写过关于这个的东西吗? 疯狂在于 PHP 的不一致。 range('A','CZ') 的工作方式与 ++ 增量器完全不同,结果数组将只包含三个值:A、B 和 C。【参考方案4】:其他人已经说过为什么 PHP 没有显示您所期望的。以下是您获得可能想要的结果的方法:
<?php
for ($i = ord('a'); $i <= ord('z'); $i++)
echo chr($i);
?>
【讨论】:
不必要的。您根本不需要执行 ord(),只需正确比较即可终止循环 +1 如果不熟悉 PHP 的一个更古怪的特性,会更容易理解。 这是自文档化代码的一个很好的例子。它很容易准确理解 b/c 它使用序数值,然后将变量显示为字符。如果最大值的测试只确定一次,for循环会更有效:“for ($i = ord('a'),$max = ord('z'); $i 【参考方案5】:为什么不直接使用range('a','z')
?
【讨论】:
【参考方案6】:试试这个代码。我认为这段代码会对你有所帮助。
$alphas = range('A', 'Z');
foreach($alphas as $value)
echo $value."<br>";
依次显示 26 个字母。
【讨论】:
【参考方案7】:<?php
$i = 'a';
do
echo ($j=$i++),"\r\n";
while (ord($j) < ord($i));
?>
【讨论】:
【参考方案8】:这个也可以用:
for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1))
echo "$i\n";
【讨论】:
【参考方案9】:PHP具有循环字母的功能,可以超出单个字符;其余的将以这种方式完成:aa ab ac... zz,依此类推。
试试这个:
<?php
for ($i = 'a'; $i !== 'aa'; $i++)
echo "$i\n";
?>
【讨论】:
【参考方案10】:虽然上面的答案对正在发生的事情很有洞察力,而且非常有趣(我不知道它会这样,很高兴知道为什么。
最简单的解决方法(尽管可能不是最有意义的)就是将条件更改为 $i != 'z'
<?php
for ($i = 'a'; $i != 'z'; $i++)
echo "$i\n";
?>
【讨论】:
请注意,这只会给你 a 到 y,而不是 z 哇!是的,好点。我可以看到增量和比较背后的逻辑,但有时 $a++ 确实很奇怪 【参考方案11】:PHP 不会认为 'AA' 小于 'Z'。 最好的方法是:
for($i = 'a'; $i != 'aa'; $i++)
echo $i;
abcdefghijklmnopqrstuvwxyz
【讨论】:
【参考方案12】:也许这段代码会起作用。简单易懂:
<?php
$ascii_val = ord("a");
for($i=$ascii_val;$i<$ascii_val+26;$i++)
echo chr($i)."\n";
?>
其中 26 是字母表中字母的总数。
【讨论】:
【参考方案13】:有几种方法可以做到这一点。
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 />";
【讨论】:
【参考方案14】:此代码将起作用。简单易懂:
<?php
// print form A to ZZ like this
// A B C ... AA AB AC ... ZA .. ZZ
$pre = "";
$i = ord('a');
for ($x = ord('a'); $pre . strtoupper(chr($x-1)) != 'AH'; $x++)
echo "". $pre . strtoupper(chr($x)) . "\n";
if(chr($x) === "z")
$pre = strtoupper(chr($i++));
$x = ord('a');
$x--;
【讨论】:
【参考方案15】:哇,我真的不知道这个,但它不是一个大代码,你可以在循环标记绝对正确后尝试 echo "z" 我使用他的方法,但如果你想要其他方法,那么你也可以尝试
<?php
for ($i = "a"; $i = "y"; $i++)
echo "$i\n";
if ($i == "z")
echo "z";
?>
【讨论】:
以上是关于为啥这段代码不简单地打印字母 A 到 Z?的主要内容,如果未能解决你的问题,请参考以下文章
If x == y: print z - 为啥我的代码不打印? [复制]