Является ли более предпочтительным или лучше работает над другим?
Есть ли разница между is_int() и ctype_digit()?
Ответ 1
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 │
└──────────┴───────────┴────────────────┘
Ответ 2
Последнее, о чем вам следует беспокоиться, - это то, насколько быстро один из них. Нет никакого способа, чтобы проверка строки для того, чтобы быть целым, будет узким местом в вашем коде.
Ответ 3
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 вернет вам значение true по типу int от -2147483647 до 2147483647.
любое значение превышает это число, вернет вам значение false, полагая, что оно запущено на 32-битной системе.
на 64 бит, он может подняться до диапазона от -9223372036854775807 до 9223372036854775807.
в плане производительности лично очень сложно сказать. ctype_digit может быть быстрее, чем is_int, но если вы должны использовать каждое значение для производительности строки, в целом.
Ответ 4
Если вам все равно, является ли аргумент типом int или строкой с числами, используйте is_numeric. Он вернет true для float, тo.
Ответ 5
Существует также 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();
Ответ 6
Ctype_digit возвращает false, если диапазон целых чисел находится в отрицательном диапазоне или между 0 и 47 или между 58 и 255. Вы можете проверить поведение 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);
}
Ответ 7
Ну это очень интересно:) Вот вся история:
is_numeric:
. Определяет, является ли переменная числом или числовой строкой. Независимо от значения отрицательный или логический или строковый или любой тип числа, если значение является чисто числом, оно вернет'true'
else'false'
.Помните: нет только персонажа Номер любого типа:)
is_init
. Определите, является ли тип переменной целым, если значение чисто целое, тогда оно вернет 'true' else 'false'.Помните: нет символа, двойного или отрицательного, только целого
in_integer
- Псевдоним is_int()
intval:
. Получите целочисленное значение переменной, оно принимает все значения и возвращает только значение Integer, если значения отрицательны, тогда возвращает значение-Integer
. Независимо от значений Integer, Float, Отрицательный илиNumberString
'или'NumberStringCharacter
. Он вычитает значения Integer из строки "If String Starts with Number
".
- NumberString= Числовое значение в формате строки
- NumberStringCharacter= Строка Начать с номера
Помните: вы получите Целое число от числа, плавающего, отрицательного или строкового, которое начинается с номера.
ctype_digit
. Проверьте числовые символы. Если полный номер, указанный в String Format, вы получите 'true
' else 'false
. Это будет работать только с StringNumber, No Float, No Negative only Whole Number как строка.Помните: целое число как строка, нет отрицательного числа, нет числа с плавающей точкой, нет номера номера, нет символа, только номер в виде строки.
Взгляд на птиц:
Благодаря http://php.net/