Domanda

È preferibile uno in più o si comporta meglio rispetto all'altro?

È stato utile?

Soluzione

is_int () restituisce vero se l'argomento è un tipo intero, ctype_digit () accetta un argomento stringa e restituisce vero se tutti i caratteri nella stringa sono cifre.

Esempio:

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

Altri suggerimenti

Esiste anche is_numeric che restituisce vero se il valore passato può essere analizzato come numero.

 inserisci qui la descrizione dell'immagine

Se provo a confrontare il rendimento delle funzioni su PHP 5.5.30 ecco i risultati:

 inserisci qui la descrizione dell'immagine

Questo è il codice che ho usato per il benchmark

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

L'ultima cosa di cui dovresti preoccuparti è la velocità di uno di questi. Non è possibile che il controllo di una stringa come numero intero costituisca un collo di bottiglia nel codice.

ctype non sempre restituisce false sul tipo intero.

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

ctype_digit restituisce vero per il seguente numero di tipo intero.

-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

la pratica di base è quella di includere ogni numero nella stringa e.q. strval ($ num) o (String) $ num in questo caso un valore negativo (-78) restituirà sempre falso.


is_int ti restituirà vero sul valore del tipo int compreso tra -2147483647 e 2147483647. qualsiasi valore superiore a quel numero ti restituirà falso presumendo che sia in esecuzione sul sistema a 32 bit. a 64 bit può arrivare fino a un intervallo compreso tra -9223372036854775807 e 9223372036854775807


in termini di performance personalmente molto difficile da dire. ctype_digit potrebbe essere più veloce di is_int ma se devi trasmettere ogni valore alle prestazioni delle stringhe si riduce complessivamente.

Se non ti interessa davvero se l'argomento è un tipo int o una stringa con numeri, usa is_numeric. Restituirà vero anche per i float, comunque.

Ctype_digit restituisce false se l'intervallo dell'intero è compreso nell'intervallo negativo o compreso tra 0 e 47 o tra 58 e 255. Puoi verificare il comportamento di ctype_digit utilizzando il frammento seguente.

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

Beh, è ??molto interessante :) Ecco tutta la storia:

  

is_numeric: & # 8212; Verifica se una variabile è un numero o una stringa numerica, indipendentemente dal valore negativo o booleano o stringa o qualsiasi tipo   di numero, se il valore è puramente numero restituirà 'true' else 'false' .

     

Ricorda: nessun carattere solo Numera qualsiasi tipo :)


  

is_init & # 8212; Scopri se il tipo di una variabile è intero, se il valore è puramente intero restituirà "true" altrimenti "false".

     

Ricorda: nessun carattere, doppio o negativo, solo intero


  

in_integer & # 8212; Alias ??di is_int ()


  

intval: & # 8212; Ottieni il valore intero di una variabile, accetta tutti i tipi di valore e restituisce solo il valore Intero, se i valori sono negativi allora   restituisce il valore " -Integer '. Non importa i valori sono Integer, Float,   Negativo o " NumberString 'o' NumberStringCharacter '.   Sottrae i valori interi da stringa " Se String inizia con   Numero ".

     
      
  • NumberString = Un valore numerico in formato stringa
  •   
  • NumberStringCharacter = Una stringa inizia con il numero
  •   
     

Ricorda: otterrai un valore intero da Numero, Virgola mobile, Negativo o Stringa che inizia con Numero.


  

ctype_digit & # 8212; Controlla i caratteri numerici, se un numero intero fornito in formato stringa otterrai " true 'else' false '. Lo farà   funziona solo con StringNumber, No Float, No Negative only Whole Number   come stringa.

     

Ricorda: numero intero come stringa, nessun numero negativo, nessun numero float, nessun tipo di numero, nessun carattere, solo numero come stringa.

Birds Eye View:

 inserisci qui la descrizione dell'immagine

Grazie a http://php.net/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top