Я играю с for-loop
а также CLI
в PHP. У меня проблема с оператором декремента (-). Ниже мой код,
<?php
$handle = fopen("php://stdin","r");
$str = fgets($handle);
for($i=$str; $i>0; $i--){
var_dump($i);
}
Он входит в бесконечный цикл для любого числа> 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
"
но если я явно наберу приведенный аргумент 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$
В строке есть разрыв $str
вы получаете из файла:
string(2) "3
"
Таким образом, символы ASCII строки #51
(разл. ASCII-код для символа «3») и #10
(разл. ASCII код для перевода строки).
Если вы используете оператор декремента i--
строка изменится на #51#09
, Следующая итерация изменит его на #51#08
,
Первый символ не будет изменен, потому что второй символ будет уменьшен. Вот почему, похоже, нет декрементации.
Решение:
Если вы измените
$str = fgets($handle);
в
$str = trim(fgets($handle));
перевод строки, вкладки и т. д. будут удалены, чтобы оператор декремента уменьшал символ #51
,
Других решений пока нет …