Pergunta

é o mais preferido, ou executa melhor sobre o outro?

Foi útil?

Solução

is_int() retorna verdadeiro se o argumento é um tipo inteiro, ctype_digit() leva um argumento de cadeia e retorna verdadeiro se todos os caracteres na seqüência são dígitos.

Exemplo:

┌──────────┬───────────┬────────────────┐
│          │  is_int:  │  ctype_digit:  │
├──────────┼───────────┼────────────────┤
│ 123      │  true     │  false         │
├──────────┼───────────┼────────────────┤
│ 12.3     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "123"    │  false    │  true          │
├──────────┼───────────┼────────────────┤
│ "12.3"   │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ "-1"     │  false    │  false         │
├──────────┼───────────┼────────────────┤
│ -1       │  true     │  false         │
└──────────┴───────────┴────────────────┘

Outras dicas

Há também is_numeric que retorna verdadeiro se passou em termos de valor pode ser analisado como um número.

enter descrição da imagem aqui

Se eu tentar comparar o desempenho de funções em PHP 5.5.30 aqui estão os resultados:

enter descrição da imagem aqui

Este é o código que usei para referência

// 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();

A última coisa que você deve se preocupar é o quão rápido uma delas é. Não há nenhuma maneira que a verificação uma corda por ser um inteiro vai ser um gargalo no seu código.

ctype não sempre retorno false do tipo inteiro.

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

ctype_digit retornar verdadeiro para o seguinte número de tipo inteiro.

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

a prática base é para caso cada número para e.q. corda strval ($ num) ou (String) $ num neste valor caso negativo (-78) sempre retornará false.


is_int irá voltar verdade sobre o valor tipo int entre -2147483647 a 2147483647. qualquer valor exceder esse número irá voltar falsa presumindo que está sendo executado em 32bits sistema. em 64bits que pode ir até gama de -9223372036854775807 para 9223372036854775807


em termos de desempenho pessoalmente muito difícil dizer. ctype_digit talvez mais rápido do que is_int mas se você tiver para lançar todos os valores para o desempenho corda é reduzida em geral.

Se você realmente não me importo se o argumento é um tipo int ou uma string com números, utilize is_numeric. Ele irá retornar verdadeiro para carros alegóricos também, tho.

ctype_digit retorna false se o intervalo de número inteiro é na faixa negativa ou entre 0 e 47 ou entre 58 e 255. Você pode verificar o comportamento do ctype_digit usando o seguinte trecho.

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

Bem, é muito interessante :) Aqui está toda a história:

is_numeric: - Verifica se a variável é um número ou uma string numérica, Nenhum valor questão é negativa ou booleano ou string ou qualquer tipo de número, se o valor é puramente número retornará 'true' else 'false' .

Lembre-se: Só nenhum caráter Número qualquer tipo:)


is_init -. Encontrar se o tipo de uma variável é inteiro, se o valor é puramente inteiro, em seguida, ele retornará 'true' else 'falso'

Lembre-se: nenhum personagem, Duplo ou negativo, Só Integer


in_integer - Sinônimo de is_int ()


intval: - Obter o valor inteiro de uma variável, é tomar todo o tipo de valor e retorna somente o valor inteiro, se os valores são negativos, em seguida, retorna ' -Integer' valor. Não há valores de matéria são Integer, Float, Negativo ou ' NumberString ' ou ' NumberStringCharacter '. É subtrair os valores inteiros de string " If String Starts with Number ".

  • NumberString value = um número no Format String
  • NumberStringCharacter = A Iniciar Cordas com número

Lembre-se:. Você vai ter valor inteiro de Número, Float, negativo ou string que é começa com número


ctype_digit - Verifica se os caracteres numérico (s), Se um número inteiro fornecido na seqüência de formato terá ' true ' else ' false '. Será trabalho com apenas StringNumber, No Float, nenhum negativo único número inteiro as String.

Lembre-se:. Whole Number como String, Não Número negativo, não Float número, não número do tipo, sem carácter, único número as String

Birds Eye View:

enter descrição da imagem aqui

Graças ao http://php.net/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top