Есть ли разница между is_int () и ctype_digit ()?

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


person Community    schedule 25.10.2008    source источник


Ответы (7)


is_int() возвращает true, если аргумент имеет целочисленный тип, _ 2_ принимает строковый аргумент и возвращает истину, если все символы в строке являются цифрами.

Пример:

┌──────────┬───────────┬────────────────┐
│          │  is_int:  │  ctype_digit:  │
├──────────┼───────────┼────────────────┤
│ 123      │  true     │  false         │
├──────────┼───────────┼────────────────┤
│ 12.3     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "123"    │  false    │  true          │
├──────────┼───────────┼────────────────┤
│ "12.3"   │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "-1"     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ -1       │  true     │  false         │
└──────────┴───────────┴────────────────┘
person Robert Gamble    schedule 25.10.2008
comment
Впечатляющий ответ! - person Player1; 27.11.2019

Также существует 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();
person Buksy    schedule 02.06.2016

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

person Andy Lester    schedule 25.10.2008

ctype не всегда возвращает false для целочисленного типа.

foreach(range(-1000 , 1000)as $num){
    if(ctype_digit($num)){
        echo $num . ", ";
    }    
}

ctype_digit возвращает истину для следующего числа целочисленного типа.

-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 to 1000

основная практика состоит в том, чтобы записать каждое число в строку e.q. strval ($ num) или (String) $ num в этом случае отрицательное значение (-78) всегда будет возвращать false.


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


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

person esd    schedule 16.09.2011
comment
ctype_digit используется только в строке - person HYDER ALI; 03.09.2015

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

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

Помните: никаких символьных цифр любого типа :)


is_init - Определите, является ли переменная целочисленным типом. Если значение является чисто целым числом, оно вернет «истина», иначе «ложь».

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


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


intval: - получить целочисленное значение переменной, оно принимает все виды значений и возвращает только целочисленное значение, если значения отрицательные, возвращает значение "-Integer". Неважно, какие значения - целое, плавающее, отрицательное, NumberString или NumberStringCharacter. Это вычитание целочисленных значений из строки «If String Starts with Number».

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

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


ctype_digit - проверьте наличие числовых символов. Если целое число указано в строковом формате, вы получите «true» или «false». Он будет работать только с StringNumber, No Float, No Negative только с целым числом как String.

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

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

введите здесь описание изображения

Спасибо http://php.net/

person Nono    schedule 08.03.2017

Если вам все равно, является ли аргумент типом int или строкой с числами, используйте is_numeric. Тем не менее, он вернет true и для поплавков.

person gnud    schedule 26.10.2008

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);
}
person masakielastic    schedule 15.06.2013