$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
Retour
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
J'ai besoin que les valeurs soient de type int au lieu de type chaîne. Existe-t-il une meilleure façon de le faire que de parcourir le tableau avec un foreach et de convertir chaque chaîne en int?
Ceci est presque 3 fois plus rapide que
explode()
,array_map()
etintval()
:la source
J'étais donc curieux de connaître les performances de certaines des méthodes mentionnées dans les réponses pour un grand nombre d'entiers.
Préparation
Je viens de créer un tableau de 1 million d'entiers aléatoires entre 0 et 100. Ensuite, je les ai implosés pour obtenir la chaîne.
Méthode 1
C'est le seul revêtement de la réponse de Mark:
Méthode 2
Voici l'approche JSON:
Méthode 3
J'ai proposé celui-ci comme modification de la réponse de Mark. Cela utilise toujours la
explode()
fonction, mais au lieu d'appeler,array_map()
j'utilise uneforeach
boucle régulière pour faire le travail afin d'éviter la surchargearray_map()
. Je suis également en train d'analyser avec(int)
vsintval()
, mais j'ai essayé les deux, et il n'y a pas beaucoup de différence en termes de performances.Résultats:
L'essentiel est la moyenne. Il semble que la première méthode ait été un peu plus lente pour 1 million d'entiers, mais je n'ai pas remarqué un gain de performances 3 fois supérieur à la méthode 2, comme indiqué dans la réponse. Il s'est avéré que la
foreach
boucle était la plus rapide dans mon cas. J'ai fait l'analyse comparative avec Xdebug.Edit: Cela fait un moment que la réponse n'a pas été publiée à l'origine. Pour clarifier, le benchmark a été fait en php 5.6.
la source
array_map(function($v){ return (int)$v; }, $strings_array);
c'est ce que je voulais direUtilisez ce code avec une fermeture (introduit dans
PHP 5.3
), c'est un peu plus rapide que la réponse acceptée et pour moi, l'intention de le convertir en un entier, est plus claire:La sortie sera:
la source
Dans la solution de Mark, vous reviendrez
array([0]=> int 0)
si vous essayez d'analyser une chaîne telle que "test".la source
Je ne sais pas si cela est plus rapide, mais retourner le tableau deux fois convertira des chaînes numériques en entiers:
la source
Une autre méthode plus courte pourrait être:
Il a les mêmes performances que la méthode 3.
la source
Si vous avez un tableau comme:
Et si vous souhaitez les convertir en nombres entiers et les conserver dans le tableau, ce qui suit devrait faire l'affaire:
la source
Ma solution consiste à convertir chaque valeur à l'aide de la fonction de rappel:
la source
Rester simple...
Pourquoi cherchez-vous d'autres moyens? La boucle fait le travail sans douleur. Si la performance est votre préoccupation, vous pouvez y aller
json_decode ()
. Les gens ont posté comment l'utiliser, donc je ne l'inclus pas ici.Remarque: Lorsque vous utilisez l'opérateur == au lieu de ===, vos valeurs de chaîne sont automatiquement converties en nombres (par exemple entier ou double) si elles forment un nombre valide sans guillemets. Par exemple:
Ainsi, == peut résoudre votre problème, est efficace, mais se cassera si vous utilisez === dans les comparaisons.
la source
Si vous disposez d'un réseau multidimensionnel, aucune des solutions mentionnées précédemment ne fonctionnera. Voici ma solution:
Ensuite, faites ceci:
Cela fera un tableau comme celui-ci:
ressemble à ca:
(Cela fonctionnera avec n'importe quel niveau de profondeur)
la source
Vous pouvez convertir des valeurs dans le tableau:
Vous pouvez également renvoyer la valeur de retour de la
explode
fonction$strings
et l'itérer au lieu d'utiliser une autre variable ($ ids).Je pense que cette solution est le moyen le plus sûr avec les meilleures performances.
la source
Style PHP 7.4:
la source
Input => '["3", "6", "16", "120"]'
Conversion de type que j'ai utilisée => (int) $ s;
Production:
Merci
la source