一个更受欢迎,还是比另一个表现更好?
7 回答
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 │
└──────────┴───────────┴────────────────┘
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> </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();
您应该担心的最后一件事是其中一个有多快。检查字符串是否为整数是不可能成为代码中的瓶颈的。
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 快,但是如果您必须将每个值都转换为字符串,则总体上会降低性能。
嗯,这很有趣:) 这是所有故事:
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。记住:整数作为字符串,没有负数,没有浮点数,没有数字类型,没有字符,只有数字作为字符串。
鸟瞰图:
如果您不关心参数是 int 类型还是带数字的字符串,请使用 is_numeric。它也会为浮点数返回 true,尽管如此。
如果整数范围在负数范围内或介于 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);
}