前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文 | PHP 打印a到z,给你5秒钟思考,看看你入了哪个坑?

3分钟短文 | PHP 打印a到z,给你5秒钟思考,看看你入了哪个坑?

作者头像
程序员小助手
发布2020-07-14 15:19:30
6040
发布2020-07-14 15:19:30
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

今天的短文,说的还是一个再正常不过的需求,就是使用 PHP 打印从字母 a 到 字母 z 的所有数值。

我想你肯定不会手动写死的是么?26个字母,毕竟也不多,很多同学都是手动敲上去的。

我们说一说容易犯的一些小错误,以加深循环对字符操作的印象。

学习时间

先说一个同学在写循环打印 a-z 字母序列的时候,遇到的坑。他的代码是这么写的:

代码语言:javascript
复制
for ($i = 'a'; $i <= 'z'; $i++)
    echo "$i\n";

想着也比较简单,不至于出什么幺蛾子。可是,错误还是一如既往地出现了。打印的内容是这么一堆乱七八糟:

是不是完全不是我们要的样子。眼尖的同学立马意识到,for 循环的结束条件出问题了。没有在打印到字母 z 的时候即时终止。

到底为什么呢?文档里说的很清楚:

在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。

在 Perl 中a = 'Z'; a++;将把

注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。

这是 PHP 独特的字符串递增所产生的。我们实际测试一下:

代码语言:javascript
复制
var_dump('aa' <= 'z'); // true
var_dump('yz' <= 'z'); // true
var_dump('za' <= 'z'); // false

所以上述的代码一直运行下去,字符串比较适中成功。为了正确地执行,代码需要修正一下:

代码语言:javascript
复制
for ($i = 'a'; $i != 'aa'; $i++)
    echo "$i\n";

在输出到字符串 'aa' 的时候立马跳出循环。这是基于上述正确理解后作出的修正。

优秀的解决方案

上述方法中使用 $i !== 'aa' 进行的操作实属无奈之举。当然是有更好的办法的,就是 PHP 内置的 range 函数,它可以生成一个序列值,容错性非常好:

代码语言:javascript
复制
foreach (range('a', 'z') as $i)
    echo "$i\n";

如果非要手动遍历,那就一定避免字符递加,而是使用整数递加,就能杜绝程序跑偏。比如使用 ord 函数,作为 ASCII 字符的边界值:

代码语言:javascript
复制
for ($i = ord('a'); $i <= ord('z'); $i++)
    echo chr($i);

写在最后

Bug 虽小,却映射出编程语言深层的原理,这样的知识,我宁愿来一打。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 学习时间
  • 优秀的解决方案
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档