C'è una differenza tra is_int () e ctype_digit ()?
Domanda
È preferibile uno in più o si comporta meglio rispetto all'altro?
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.
Se provo a confrontare il rendimento delle funzioni su PHP 5.5.30 ecco i risultati:
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> </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:
Grazie a http://php.net/