php 定义a z字母,关于php:为什么这段代码只打印字母A到Z?

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";

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值