En utilisant PHP, quel est le moyen le plus rapide pour convertir une chaîne comme celle-ci: "123"
en entier?
Pourquoi cette méthode particulière est-elle la plus rapide? Que se passe-t-il s'il reçoit une entrée inattendue, comme "hello"
ou un tableau?
php
optimization
casting
nickf
la source
la source
(int)
etintval()
peut être supérieure à 400%!Réponses:
Je viens de mettre en place un exercice de benchmarking rapide:
En moyenne, appeler intval () est deux fois et demi plus lent, et la différence est la plus grande si votre entrée est déjà un entier.
J'aimerais savoir pourquoi cependant.
Mise à jour: j'ai relancé les tests, cette fois avec coercition
(0 + $var)
Addendum: Je viens de rencontrer un comportement légèrement inattendu dont vous devez être conscient lorsque vous choisissez l'une de ces méthodes:
Testé avec PHP 5.3.1
la source
+"15" == 15
(int)
etintval
, et dans chaque paire, donne un% surintval
, le cas de base doit être(int)
. Mais vous avez raison de dire qu'il aurait été plus clair s'il l'avait dit explicitement, surtout depuis qu'il a ajouté plus tard un troisième cas!Personnellement, je pense que le casting est le plus joli.
Si une chaîne comme 'Hello' est envoyée, elle sera convertie en entier 0. Pour une chaîne telle que '22 ans ', elle sera convertie en entier 22. Tout ce qu'elle ne peut pas analyser en nombre devient 0.
Si vous avez vraiment BESOIN de la vitesse, je suppose que les autres suggestions ici sont correctes en supposant que la contrainte est la plus rapide.
la source
Exécutez un test.
Il s'agissait d'un test qui a exécuté chaque scénario 10 000 000 fois. :-)
La coercition est
0 + "123"
Le casting est
(integer)"123"
Je pense que Co-ercion est un tout petit peu plus rapide. Oh, et essayer
0 + array('123')
est une erreur fatale en PHP. Vous voudrez peut-être que votre code vérifie le type de la valeur fournie.Mon code de test est ci-dessous.
la source
settype
à ce test et l' ai exécuté en utilisant PHP 7. Le cast est ressorti légèrement devant et une amélioration des performances par-dessus tout: contrainte de chaîne: 1.9255340099335 conversion de chaîne: 1.5142338275909 type de chaîne: 4.149735212326 échec de la chaîne contrainte: 1.2346560955048 échec de la chaîne cast: 1.3967711925507 échec de la chaîne settype: 4.149735212326Vous pouvez simplement convertir une chaîne longue en entier en utilisant FLOAT
$float = (float)$num;
Ou si vous voulez un entier non flottant, alors allez avec
$float = (int)$num;
Par exemple.
la source
(int)
? Il peut être vrai que si la chaîne contient un entier, cela(float)
renverra une valeur qui agit beaucoup comme un entier (même si son type interne est probablementfloat
), mais pourquoi feriez-vous cela, si la spécification doit renvoyer une valeur entière ? Supposons que la chaîne entrante soit "1,3"? Vous n'obtiendrez pas un entier. Aussi, pour le plaisir de quiconque lira le code à l'avenir, vous devriez dire ce que vous voulez dire. Si vous voulez dire "ce devrait être un entier", alors dites(int)
non(float)
.la source
excréter un entier à partir d'une chaîne
$ in = 'tel.123-12-33';
// $ out = '1231233';
la source
Plus de résultats de référence ad hoc:
la source
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Il est également risqué d'utiliser"-11"
directement la valeur littérale , sauf si vous êtes certain que la langue ne fera pas une partie du travail au moment de la compilation. Probablement OK pour un langage dynamique comme PHP, mais je mentionne pour référence future si je teste des formules dans d'autres langages. Plus sûr de définir une variable$x = "-11"
avant la boucle de test, puis de l'utiliser. Pour que le code interne soit$i =+$x
.Exécuter une référence, et il s'avère que le moyen le plus rapide d'obtenir un entier réel (en utilisant toutes les méthodes disponibles) est
Juste en utilisant
renvoie un flotteur.
la source
(int)"12.345"
? Plus rapide de quel pourcentage?