2010-04-02 3 views
0

Учитывая следующий фрагмент кода:PHP свободно набрав в то время как сравнение цикла

$i= 11; 
    function get_num() { 
    global $i; 
    return (--$i >= 0) ? $i : false; 
    } 
    while($num = get_num()) { 
    echo "Number: $num\n"; 
    } 

Результаты в следующий вывод:

Number: 10 
Number: 9 
Number: 8 
Number: 7 
Number: 6 
Number: 5 
Number: 4 
Number: 3 
Number: 2 
Number: 1 

Однако, я также хочу его выход Number: 0 - но время цикла оценивает 0 как false, поэтому цикл никогда не доходит до этой точки. Как получить цикл для завершения только на явном false?

ответ

2
while(($num = get_num()) !== false) { 

дополнительной = сила проверка типа, а также.

0
<?php 
    $i= 11; 
    function get_num() { 
    global $i; 
    return (--$i >= 0) ? $i : false; 
    } 
    while(($num = get_num())!==false) { 
    echo "Number: $num\n"; 
    } 
?> 
0

Вы должны сделать сравнение, которое сравнивает типы, а не только значения - что означает использование === или !== операторов, вместо == или !=.

Таким образом, вы могли бы использовать что-то вроде:

while(($num = get_num()) !== false) { 
    echo "Number: $num\n"; 
} 

С этим, 0 не будет рассматриваться как одно и то же, как false.


Для справки: Comparison Operators(со ссылкой)

$a == $b: Равное: TRUE, если $a равно $b.
$a === $b : Идентичные: TRUE если $a является равна $b, и они имеют же типа.

0

Я заметил, что вы используете global. Некоторые разработчики кричат ​​об использовании global, когда это не необходимо. Кроме того, вы можете оставить круглые скобки, если вы напишете false!== перед вашей декларацией $num (неважно, просто записка).

Вариант 1

function get_num() { 
    static $i=11; // effectively only declare the value once 
    return (--$i >= 0) ? $i : false; 
} 
while(false!==$num=get_num()){ 
    echo "Number: $num\n"; // $i is NOT available outside the scope of the function. 
} 

Вариант 2

function get_num($i) { 
    return (--$i >= 0) ? $i : false; 
} 
$num=11; // declare in global scope 
while(false!==$num=get_num($num)){ // pass it to function as an argument 
    echo "Number: $num\n"; 
}