web-dev-qa-db-ja.com

is_int()とctype_digit()に違いはありますか?

どちらが優先されますか、それとも他よりもパフォーマンスが優れていますか?

37
Matt

is_int() 引数が整数型の場合はtrueを返し、 ctype_digit() は文字列引数を取り、のすべての文字がtrueを返す場合文字列は数字です。

例:

┌──────────┬───────────┬────────────────┐
│          │  is_int:  │  ctype_digit:  │
├──────────┼───────────┼────────────────┤
│ 123      │  true     │  false         │
├──────────┼───────────┼────────────────┤
│ 12.3     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "123"    │  false    │  true          │
├──────────┼───────────┼────────────────┤
│ "12.3"   │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "-1"     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ -1       │  true     │  false         │
└──────────┴───────────┴────────────────┘
91
Robert Gamble

もあります - is_numeric 渡された値が数値として解析できる場合、trueを返します。

enter image description here

PHP 5.5.30で関数のパフォーマンスを比較しようとすると、次の結果が得られます。

enter image description here

これは私がベンチマークに使用したコードです

// print table cell and highlight if lowest value is used
function wr($time1, $time2, $time3, $i) {
    if($i == 1) $time = $time1;
    if($i == 2) $time = $time2;
    if($i == 3) $time = $time3;

    echo('<td>');
    if(min($time1, $time2, $time3) === $time) printf('<b>%.4f</b>', $time);
    else printf('%.4f', $time);
    echo('</td>');
}


$test_cases = array( 123, 12.3, '123', true);
$tests = 1000000;
$result = true;  // Used just to make sure cycles won't get optimized out
echo('<table>'.PHP_EOL);
echo('<tr><td>&nbsp;</td><th>is_int</th><th>ctype_digit</th><th>is_numeric</th></tr>');
foreach($test_cases as $case) {
    echo('<tr><th>'.gettype($case).'</th>');

    $time = microtime(true);
    for($i = 0; $i < $tests; $i++) {
        $result |= is_int((int)Rand());
    }
    $time1 = microtime(true)-$time;

    $time = microtime(true);
    for($i = 0; $i < $tests; $i++) {
        $result |= ctype_digit((int)Rand());
    }
    $time2 = microtime(true)-$time;

    $time = microtime(true);
    for($i = 0; $i < $tests; $i++) {
        $result |= is_numeric((int)Rand());
    }
    $time3 = microtime(true)-$time;

    wr($time1, $time2, $time3, 1);
    wr($time1, $time2, $time3, 2);
    wr($time1, $time2, $time3, 3);
    echo('</tr>'.PHP_EOL);
}

echo('</table>');

exit();
5
Buksy

ctype not常に整数型でfalseを返します。

foreach(range(-1000 , 1000)as $num){
    if(ctype_digit($num)){
        echo $num . ", ";
    }    
}

ctype_digitは、次の整数型の数値に対してtrueを返します。

-78、-77、-71,48,49,50,51,52,53,54,55,56,57,178,179,185、256,257,258,259,260,261,262,263,264,265,266,267,268,269,270から1000

基本的な方法は、すべての数値を文字列e.qに変換することです。 strval($ num)または(String)$ numこの場合、負の値(-78)は常にfalseを返します。


is_intは、-2147483647から2147483647までのint型の値でtrueを返します。その数を超える値は、32ビットシステムで実行されていると想定してfalseを返します。 64ビットでは、-9223372036854775807〜9223372036854775807の範囲になります。


パフォーマンスの観点から、個人的には非常に言いにくいです。 ctype_digitはis_intよりも高速かもしれませんが、すべての値を文字列にキャストする必要がある場合、全体的なパフォーマンスが低下します。

3
esd

あなたが心配しなければならない最後のことは、これらのうちの1つがどれくらい速いかです。文字列が整数であるかどうかをチェックすることが、コードのボトルネックになる方法はありません。

3
Andy Lester

引数がint型なのか、数値を含む文字列なのかを気にしない場合は、is_numericを使用してください。フロートについてもtrueを返します。

1
gnud

まあそれは非常に興味深いです:)ここにすべての話があります:

is_numeric:—変数が数値であるか数値文字列であるかを検索します。値が負、ブール、文字列、または任意のタイプの数値であるかどうかは関係ありません。 、値が純粋に数値の場合は、'true'else'false'

覚えておいてください:文字なし番号任意のタイプ:)


is_init—変数の型が整数かどうかを調べます。値が純粋に整数の場合は「true」、それ以外の場合は「false」を返します。 。

覚えておいてください:文字なし、ダブルまたはネガティブ、整数のみ


in_integer— is_int()のエイリアス


intval:—変数の整数値を取得します。すべての種類の値を取り、整数値のみを返します。値が負の場合は、 '-Integer'値。値が整数、浮動小数点、負、または 'NumberString'または 'NumberStringCharacter '。文字列 "If String Starts with Number"から整数値を減算します。

  • NumberString=文字列形式の数値
  • NumberStringCharacter=数値で始まる文字列

覚えておいてください:Number、Float、Negative、またはNumberで始まるStringから整数値を取得します。


ctype_digit—数字を確認します。整数が文字列形式で指定されている場合は、 'true 'else'false '。文字列として、StringNumberのみ、Floatなし、Negativeのみの整数のみで機能します。

覚えておいてください:文字列としての整数、負の数なし、浮動小数点数なし、数値タイプなし、文字なし、文字列としての数値のみ

鳥瞰図:

enter image description here

ありがとう http://php.net/

1
Neeraj Singh

整数の範囲が負の範囲、0〜47、または58〜255の場合、Ctype_digitはfalseを返します。次のスニペットを使用して、ctype_digitの動作を確認できます。

setlocale(LC_ALL, 'en_US.UTF-8');
var_dump(
    true === array_every(range(-1000, -1), 'ctype_digit_returns_false'),
    true === array_every(range(0, 47), 'ctype_digit_returns_false'),
    true === array_every(range(48, 57), 'ctype_digit_returns_true'),
    true === array_every(range(58, 255), 'ctype_digit_returns_false'),
    true === array_every(range(256, 1000), 'ctype_digit_returns_true')
);

// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every
function array_every(array $array, $callable)
{
    $count = count($array);

    for ($i = 0; $i < $count; $i +=1) {

        if (!$callable($array[$i])) {

            return false;

        }

    }

    return true;
}

function ctype_digit_returns_true($v)
{
    return true === ctype_digit($v);
}

function ctype_digit_returns_false($v)
{
    return false === ctype_digit($v);
}
0
masakielastic