Оператор жонглирования и декремента PHP-типов

Я играю с 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$

0

Решение

В строке есть разрыв $str вы получаете из файла:

string(2) "3
"

Таким образом, символы ASCII строки #51 (разл. ASCII-код для символа «3») и #10 (разл. ASCII код для перевода строки).
Если вы используете оператор декремента i-- строка изменится на #51#09, Следующая итерация изменит его на #51#08,

Первый символ не будет изменен, потому что второй символ будет уменьшен. Вот почему, похоже, нет декрементации.

Решение:

Если вы измените

$str = fgets($handle);

в

$str = trim(fgets($handle));

перевод строки, вкладки и т. д. будут удалены, чтобы оператор декремента уменьшал символ #51,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]