2

次の関数は私を夢中にさせました。いったいどうして 100x が 100 に等しいのに、100x が整数として報告されるのでしょうか?
私の人生では、それを理解することはできません。全体をコピーして貼り付けて、自分で確認できます。
ここのどこかに簡単なポイントがありません。助けてください。

function blp_int($val) {
    $orgval = $val;
    $num = (int)$val;    
    echo "<li><font color=red>val: ". $val . " is being checked to see if it's an integer or not";
    echo "<li><font color=red>orgval: ". $orgval ;
    echo "<li><font color=red>num: ". $num ;
    if ($orgval==$num) {
        echo "<li><font color=red><b>YES IT IS! the [{$orgval}] is equal to [{$num}]</b>";
        return true;
    }
    return false;
}

if (blp_int("100"))
{
    echo "<h1>100 is an integer!</h1>";
}
else
{
    echo "<h1>100 is NOT an integer!</h1>";
}

if (blp_int("100x"))
{
    echo "<h1>100x is an integer!</h1>";
}
else
{
    echo "<h1>100x is NOT an integer!</h1>";
}

上記のコードを実行すると、次が返されます。

val: 100 is being checked to see if it's an integer or not
orgval: 100
num: 100
YES IT IS. the [100] is equal to [100]
100 is an integer!

val: 100x is being checked to see if it's an integer or not
orgval: 100x
num: 100
YES IT IS. the [100x] is equal to [100]
100x is an integer!

次のビットを追加することで状況を改善できます

    if (!is_numeric($val))
    {
        return false;
    }

すぐに blp_int 関数の先頭に移動しますが、..なぜ地球上で php が 100x=100 が等しいと考えるのかを知りたいと思っています。

4

4 に答える 4

2

この例でわかるように100x、整数としてキャストすると、それが に変換され100ます。厳密な比較を使用していないため、'100x' == 100真です。PHP は を削除しx100.

'100x' === 100false を返すような厳密な比較 (型も比較します) を使用できます。これを使用すると、文字列が整数と比較されるたびに false が返されます。


編集 is_numericによると、 などの文字列としてフォーマットされた数値に対して true を返すため、最も信頼できるとは限りません'100'。数値を整数(文字列ではなく) にしたい場合は、is_integer代わりに を使用できます。あなたが何をしているのか正確にはわかりませんが、このメモを追加したいと思いました。

于 2012-02-29T19:38:19.983 に答える
1

IF では 3 つの等号を使用する必要があると思います。

if ($orgval===$num) {

それ以外の場合、PHP は値100x100andにキャストします100=100

ドキュメンテーション: 比較演算子

于 2012-02-29T19:37:12.230 に答える
1

どのようなチェックを行いたいですか?あなたがそれについて行くことができるいくつかの方法があります:

if (preg_match('!^[0-9]+$!', $input))

if (intval($input) == $input)

if (intval($input) === $input)

if ('x'.intval($input) === 'x'.$input)

それが整数であるかどうかをどれだけ厳密に確認したいかによって異なります。最初に必要かどうかは重要ですtrim()か?

于 2012-02-29T19:39:42.713 に答える
0

にキャストするか、http://php.net/manual/en/function.ctype-digit.phpintを試してください。if にも必要です。===

于 2012-02-29T19:36:42.150 に答える