2016-07-10 5 views
0

は私の関数である。私の関数が予期しない結果を返すのはなぜですか?ここ

function getShortNum($n) { 
    if  ($n < 10000)  return $n; 
    elseif ($n < 100000) return round($n/1000, 1) . "k"; 
    elseif ($n < 1000000) return floor($n/1000) . "k"; 
    elseif ($n < 1000000000) return floor($n/1000000) . "M"; 
    else      return "Wow!!!";  
} 

ご覧のとおり、私の関数は、短い番号に長い数字を変換します。いくつかの例を示します。

1  => 1 
10  => 10 
100  => 100 
1000  => 1000 
1001  => 1001 
10000 => 10k 
10100 => 10.1k 
100000 => 100k 
101000 => 101k 
101111 => 101k 
1000000 => 1M 
1111111 => 1M 
10111111 => 10M 
11000000 => 11M 

その関数に手紙を渡すと、まったく同じことが返されます。例:

echo getShortNum("N"); // output: N 

なぜですか?すべての私の条件は、その関数内の数字であり、文字ではありません。それはどうやって動くの?

答えて

4

PHPはtype jugglingです。文字列 "N"を整数に変換し、if/elseステートメントでの比較を行います。 "N"は最初の比較と一致するゼロになります。

タイプジャグリングは、バグや予期しない結果を検出するのを困難にする可能性があるため、PHPの非常に重要な側面です。

数値以外の値が変換されないようにするには、is_numeric(),is_integer()filter_var()などの関数を使用してデータ型をチェックする必要があります。

+0

です。 thx .. +1 – Shafizadeh

3

$n < 10000と比較する数値にNを変換すると、$n0になり、最初の条件が真となります。 (返されるのは$nです(この場合はNです)

+0

それを得た.. thx .. +1 – Shafizadeh

関連する問題