40

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

4

7 に答える 7

103

is_int()引数が整数型の場合ctype_digit()は true を返し、文字列引数を取り、文字列内のすべての文字が数字の場合は 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         │
└──────────┴───────────┴────────────────┘
于 2008-10-25T13:34:51.310 に答える
9

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

ここに画像の説明を入力

PHP 5.5.30で関数のパフォーマンスを比較しようとすると、結果は次のようになります。

ここに画像の説明を入力

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

// 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();
于 2016-06-02T07:48:21.117 に答える
3

ctypeは、整数型に対して常に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

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


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


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

于 2011-09-16T01:18:36.673 に答える
3

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

于 2008-10-25T13:40:18.020 に答える
2

とても興味深いです:) ここにすべての話があります:

is_numeric:— 変数が数値か数値文字列かを調べます。値が負、ブール値、文字列、または任意のタイプの数値に関係なく、値が純粋な数値の場合は'true'elseを返します'false'

覚えておいてください:文字のみの数字はありません:)


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

覚えておいてください:文字なし、倍精度または負、整数のみ


in_integer— is_int() のエイリアス


intval:— 変数の整数値を取得します。すべての種類の値を取り、整数値のみを返します。値が負の場合は ' -Integer' 値を返します。値が Integer、Float、Negative、または ' NumberString' または ' NumberStringCharacter' であっても問題ありません。文字列 " " から整数値を減算しますIf String Starts with Number

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

注意: Number、Float、Negative、または Number で始まる String から整数値を取得します。


ctype_digit— 数字をチェックします。整数が文字列形式で指定されている場合は、' true' でなければ ' 'が返されますfalse。StringNumber のみ、浮動小数点数なし、Negative なし、文字列としての整数のみで機能します。

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

鳥瞰図:

ここに画像の説明を入力

http://php.net/に感謝

于 2017-03-08T18:31:21.090 に答える
1

引数が int 型か数値を含む文字列かをあまり気にしない場合は、is_numeric を使用します。float に対しても true を返します。

于 2008-10-26T12:05:02.217 に答える
0

整数の範囲が負の範囲、または 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);
}
于 2013-06-15T13:52:13.280 に答える