我在PHP中使用for-loop
和CLI
。我遇到了减量运算符( - )的问题。以下是我的代码,
<?php
$handle = fopen("php://stdin","r");
$str = fgets($handle);
for($i=$str; $i>0; $i--){
var_dump($i);
}
对于任何数字&gt;它进入无限循环0.以下是输出,
john@doe:/var/www/html/rank$ php 1.php
3
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
但是如果我明确地将cast cli参数键入int
,它就可以了,
<?php
$handle = fopen("php://stdin","r");
$str = (int)fgets($handle);
for($i=$str; $i>0; $i--){
var_dump($i);
}
输出
john@doe:/var/www/html/rank$ php 1.php
3
int(3)
int(2)
int(1)
john@doe:/var/www/html/rank$
我做错了什么或类型杂耍对减量运算符(故意)不起作用?因为它似乎可以使用增量运算符(++),如下所示
<?php
$handle = fopen("php://stdin","r");
$str = fgets($handle);
for($i="1"; $i<=$str; $i++){
var_dump($i);
}
输出
john@doe:/var/www/html/rank$ php 1.php
3
string(1) "1"
int(2)
int(3)
john@doe:/var/www/html/rank$
答案 0 :(得分:2)
您从文件中获取的$str
中有一个换行符:
string(2) "3
"
所以字符串的ascii字符是#51
(dec.Charles的ASCII代码&#34; 3&#34;)和#10
(dec。用于换行的ASCII代码)。
如果使用减量运算符i--
,则字符串将更改为#51#09
。下一次迭代会将其更改为#51#08
。
第一个字符不会被更改,因为第二个字符将被减少。这就是它看起来没有减少的原因。
<强>解决方案:强>
如果你改变了
$str = fgets($handle);
到
$str = trim(fgets($handle));
换行符,制表符等将被移除,递减运算符将递减字符#51
。