intval()
La fonction intval() est une fonction intégrée en PHP qui convertit une variable en entier, similaire à floatval() qui convertit une variable.
Introduction
La fonction intval() retourne la valeur entière d'une variable. C'est l'une des fonctions de conversion de type de PHP, aux côtés de floatval(), strval() et boolval(). On utilise intval() quand on dispose de données qui ressemblent à un nombre mais sont stockées sous forme de chaîne, de flottant ou d'un autre type — par exemple une valeur issue d'un formulaire, d'un paramètre de requête URL ou d'un fichier CSV — et qu'on a besoin d'un vrai entier pour compter, indexer ou effectuer des calculs.
Cette page couvre la signature de la fonction, le fonctionnement du paramètre optionnel $base, le comportement avec chaque type d'entrée, ainsi que les pièges courants.
Syntaxe
intval(mixed $value, int $base = 10): intElle accepte jusqu'à deux paramètres et retourne toujours un int :
$value— la valeur à convertir. Il peut s'agir d'une chaîne, d'un flottant, d'un boolean, denullou d'un array.$base(optionnel) — la base numérique dans laquelle interpréter$value. Elle n'est utilisée que lorsque$valueest une chaîne ; elle est ignorée pour tout autre type. La valeur par défaut est10.
intval() ne lève jamais d'exception et ne retourne jamais null. Si elle ne trouve pas de nombre à analyser, elle retourne 0.
Exemple de base
Voici le cas le plus courant — transformer des chaînes à apparence numérique en entiers, y compris avec des bases non décimales :
Le deuxième argument indique à intval() comment lire la chaîne. "101010" en base 2 vaut 42 en décimal, et "2c" en base 16 vaut 44 en décimal. Une chaîne sans partie numérique initiale, comme "not a number", produit 0.
Conversion de types non-chaîne
Quand on passe autre chose qu'une chaîne, intval() suit les règles normales de transtypage entier de PHP et ignore $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)
?>Deux points à retenir :
- Les flottants sont tronqués vers zéro, pas arrondis.
intval(4.7)vaut4, etintval(-4.7)vaut-4. Si vous souhaitez arrondir, utilisez d'abordround(). - Les arrays se convertissent en
0lorsqu'ils sont vides et en1lorsqu'ils ne le sont pas — ce n'est presque jamais ce qu'on attend, donc ne comptez pas dessus.
Comment les chaînes sont analysées
Pour les chaînes, intval() lit la partie numérique initiale et s'arrête au premier caractère qu'elle ne peut pas interpréter :
<?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)
?>Détection automatique de la base avec $base = 0
Si vous définissez $base à 0, intval() examine le préfixe de la chaîne et choisit automatiquement 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)
?>C'est pratique pour analyser des valeurs de configuration qui peuvent être écrites dans différentes notations.
Pièges courants
Littéraux octaux vs. chaînes octales. Un zéro initial dans le code source rend un nombre octal avant même que intval() soit appelée, donc intval(042) vaut 34 (car 042 est déjà 34). Mais la chaîne "042" vaut 42 en décimal avec la base par défaut 10. Conservez les nombres sous forme de chaînes si vous souhaitez un traitement prévisible.
$base n'a aucun effet sur les non-chaînes. intval(255, 16) vaut 255, pas 597 — la base est ignorée car 255 est déjà un entier. Convertissez depuis une chaîne si vous souhaitez réinterpréter les chiffres.
Valeurs hors plage. Sur une plateforme 64 bits, une valeur supérieure à PHP_INT_MAX sature à PHP_INT_MAX plutôt que de déborder vers un nombre négatif.
Quand utiliser intval() vs. les alternatives
- Utilisez
intval()quand vous voulez une conversion tolérante qui retourne0en cas d'échec et peut lire d'autres bases. - Utilisez le transtypage
(int)((int)$value) pour un transtypage rapide en base décimale ; il se comporte commeintval()avec la base 10. - Utilisez
filter_var($value, FILTER_VALIDATE_INT)quand vous avez besoin d'une validation — il retournefalsepour une entrée non entière au lieu de donner silencieusement0, ce qui vous permet de distinguer un vrai0d'un échec d'analyse.
Conclusion
intval() convertit des chaînes, des flottants, des booleans et d'autres valeurs en entier, avec une base optionnelle pour analyser des chaînes en binaire, octal, hexadécimal ou tout radix de 2 à 36. Son comportement tolérant — retourner 0 en cas d'échec et tronquer les flottants — le rend pratique, mais cette même tolérance peut masquer des entrées incorrectes. Préférez donc filter_var() quand vous avez réellement besoin de valider. Pour les conversions associées, consultez floatval(), strval() et gettype().