Есть ли разница между is_int () и ctype_digit ()? - PullRequest
35 голосов
/ 25 октября 2008

Один из них предпочтительнее или лучше других?

Ответы [ 7 ]

84 голосов
/ 25 октября 2008

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         │
└──────────┴───────────┴────────────────┘
4 голосов
/ 02 июня 2016

Существует также 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();
3 голосов
/ 16 сентября 2011

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) всегда будет возвращать ложь.


is_int вернет вам true для значения типа int в диапазоне от -2147483647 до 2147483647. любое значение, превышающее это число, вернет вам ложь, если оно работает в 32-битной системе. на 64 битах он может доходить до диапазона от -9223372036854775807 до 9223372036854775807


в плане производительности лично очень сложно сказать. ctype_digit может быть быстрее, чем is_int, но если вам нужно привести каждое значение к строковой, производительность в целом снижается.

3 голосов
/ 25 октября 2008

Последнее, о чем вам следует беспокоиться, это о том, насколько быстро один из них. Невозможно, чтобы проверка строки на целочисленность была узким местом в вашем коде.

1 голос
/ 26 октября 2008

Если вам неважно, является ли аргумент типом int или строкой с числами, используйте is_numeric. Он также вернет истину для чисел с плавающей точкой, хотя.

0 голосов
/ 08 марта 2017

Ну, это очень интересно :) Вот и вся история:

is_numeric: - определяет, является ли переменная числом или числовой строкой, независимо от того, является ли значение отрицательным, логическим, или строковым, или любого другого типа. числа, если значение является просто числом, оно вернет 'true' иначе 'false'.

Запомните: без символов Только номер любого типа:)


is_init - определяет, является ли тип переменной целочисленным; если значение является чисто целочисленным, то оно вернет 'true', иначе 'false'.

Помните: без символов, двойных или отрицательных, только целые числа


in_integer - Псевдоним is_int ()


intval: - Получить целочисленное значение переменной, оно принимает все виды значений и возвращает только целочисленное значение, если значения отрицательные, то возвращает значение -Integer. Независимо от значения Integer, Float, Отрицательный или 'NumberString' или 'NumberStringCharacter'. Вычитаем целочисленные значения из строки "If String Starts with Number".

  • NumberString = Числовое значение в строковом формате
  • NumberStringCharacter = Строка, начинающаяся с номера

Помните: вы получите целочисленное значение от Number, Float, Negative или String, которое начинается с Number.


ctype_digit - Проверьте числовой символ (ы), если весь номер указан в формате строки, вы получите 'true' else 'false». Будет работать только с StringNumber, No Float, No Negative only Whole Number как строка.

Помните: целое число в виде строки, без отрицательного числа, без числа с плавающей запятой, без номера типа, без символа, только число в виде строки.

Вид с высоты птичьего полета:

enter image description here

Благодаря http://php.net/

0 голосов
/ 15 июня 2013

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);
}
...