intval()
La funzione intval() è una funzione integrata in PHP che converte una variabile in un intero, simile a floatval() per i numeri in virgola mobile.
Introduzione
La funzione intval() restituisce il valore intero di una variabile. È una delle funzioni di conversione di tipo di PHP, insieme a floatval(), strval() e boolval(). Si ricorre a intval() quando si hanno dati che sembrano un numero ma sono memorizzati come stringa, float o altro tipo — ad esempio un valore proveniente da un form, un parametro query URL o un file CSV — e si ha bisogno di un intero reale per contare, indicizzare o eseguire operazioni aritmetiche.
Questa pagina illustra la firma della funzione, come funziona il parametro opzionale $base, cosa accade con ciascun tipo di input e le insidie più comuni.
Sintassi
intval(mixed $value, int $base = 10): intAccetta fino a due parametri e restituisce sempre un int:
$value— il valore da convertire. Può essere una stringa, un float, un boolean,nullo un array.$base(opzionale) — la base numerica in cui interpretare$value. Viene usata solo quando$valueè una stringa; viene ignorata per qualsiasi altro tipo. Il valore predefinito è10.
intval() non genera mai eccezioni e non restituisce mai null. Se non riesce a trovare un numero da analizzare, restituisce 0.
Esempio di base
Ecco il caso più comune — trasformare stringhe numeriche in interi, incluse basi non decimali:
Il secondo argomento indica a intval() come leggere la stringa. "101010" in base 2 corrisponde al decimale 42, e "2c" in base 16 corrisponde al decimale 44. Una stringa priva di parte numerica iniziale, come "not a number", produce 0.
Conversione di tipi non-stringa
Quando si passa qualcosa di diverso da una stringa, intval() segue le normali regole di cast intero di PHP e ignora $base:
<?php
echo intval(4.7) . "\n"; // 4 (floats are truncated, not rounded)
echo intval(true) . "\n"; // 1 (false → 0)
echo intval(null) . "\n"; // 0
echo intval([]) . "\n"; // 0 (empty array)
echo intval([0]) . "\n"; // 1 (non-empty array)
?>Due cose da ricordare:
- I float vengono troncati verso lo zero, non arrotondati.
intval(4.7)è4eintval(-4.7)è-4. Se si desidera l'arrotondamento, usare primaround(). - Gli array si convertono in
0se vuoti e in1se non vuoti — quasi mai quello che si vuole, quindi non fare affidamento su questo comportamento.
Come vengono analizzate le stringhe
Per le stringhe, intval() legge la parte numerica iniziale e si ferma al primo carattere che non riesce a interpretare:
<?php
echo intval("12abc") . "\n"; // 12 (stops at "a")
echo intval(" 123 ") . "\n"; // 123 (leading whitespace is skipped)
echo intval("abc12") . "\n"; // 0 (starts with a non-number)
?>Rilevamento automatico della base con $base = 0
Se si imposta $base a 0, intval() esamina il prefisso della stringa e sceglie automaticamente la base:
<?php
echo intval("0x1A", 0) . "\n"; // 26 (0x → hexadecimal)
echo intval("0b101", 0) . "\n"; // 5 (0b → binary)
echo intval("042", 0) . "\n"; // 34 (leading 0 → octal)
echo intval("42", 0) . "\n"; // 42 (no prefix → decimal)
?>Questo è utile quando si analizzano valori di configurazione che possono essere scritti in notazioni diverse.
Insidie comuni
Letterali ottali vs. stringhe ottali. Uno zero iniziale nel codice sorgente trasforma un numero in un letterale ottale prima ancora che intval() venga eseguito, quindi intval(042) è 34 (perché 042 vale già 34). Ma la stringa "042" in base 10 predefinita è il decimale 42. Mantenere i numeri come stringhe se si desidera un'analisi prevedibile.
$base non fa nulla per i non-stringa. intval(255, 16) è 255, non 597 — la base viene ignorata perché 255 è già un intero. Convertire da una stringa se si intende reinterpretare le cifre.
Valori fuori intervallo. Su una piattaforma a 64 bit, un valore maggiore di PHP_INT_MAX viene saturato a PHP_INT_MAX anziché andare in overflow verso un numero negativo.
Quando usare intval() rispetto alle alternative
- Usare
intval()quando si vuole una conversione tollerante che restituisce0in caso di errore e può leggere altre basi. - Usare il cast
(int)((int)$value) per un cast rapido solo in base decimale; si comporta comeintval()con base 10. - Usare
filter_var($value, FILTER_VALIDATE_INT)quando si ha bisogno di validazione — restituiscefalseper input non intero invece di restituire silenziosamente0, così è possibile distinguere un vero0da un errore di analisi.
Conclusione
intval() converte stringhe, float, boolean e altri valori in un intero, con una base opzionale per analizzare stringhe in binario, ottale, esadecimale o qualsiasi radice da 2 a 36. Il suo comportamento tollerante — restituire 0 in caso di errore e troncare i float — lo rende conveniente, ma quella stessa tolleranza può nascondere input errati, quindi preferire filter_var() quando si ha effettivamente bisogno di validare. Per le conversioni correlate, vedere floatval(), strval() e gettype().