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

您应该担心的最后一件事是其中一个有多快。检查字符串是否为整数是不可能成为代码中的瓶颈的。

于 2008-10-25T13:40:18.020 回答
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 回答
2

嗯,这很有趣:) 这是所有故事:

is_numeric:- 查找变量是数字还是数字字符串,无论 value 是负数还是 Boolean 或 String 或任何类型的数字,如果 value 是纯数字,它将返回'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 开头的 Number、Float、Negative 或 String 获得整数值。


ctype_digit— 检查数字字符,如果以字符串格式提供整数,您将得到 ' true' else ' false'。它仅适用于 StringNumber、No Float、No Negative only Whole Number as String。

记住:整数作为字符串,没有负数,没有浮点数,没有数字类型,没有字符,只有数字作为字符串。

鸟瞰图:

在此处输入图像描述

感谢http://php.net/

于 2017-03-08T18:31:21.090 回答
1

如果您不关心参数是 int 类型还是带数字的字符串,请使用 is_numeric。它也会为浮点数返回 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 回答