287 votes

Convertir les valeurs d'un tableau de chaînes de caractères en int ?

Le code suivant :

$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);

Retourne le tableau :

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 du type string . Y a-t-il une meilleure façon de procéder que de parcourir le tableau en boucle avec la fonction foreach et en convertissant chaque string a int ?

1 votes

Pour les chercheurs qui recherchent une solution adaptée aux données multidimensionnelles, veuillez consulter cette question similaire : stackoverflow.com/questions/27147105/

654voto

Mark Baker Points 90240

Vous pouvez y parvenir en utilisant le code suivant,

$integerIDs = array_map('intval', explode(',', $string));

4 votes

Mais si vous avez la chaîne 'test', vous obtenez : array([0]=> 0 )

12 votes

@Dmitry - c'est exact.... c'est une réponse à la question du PO, pas une réponse 100% parfaite dans tous les cas à toutes les questions connexes potentielles. Le PO avait une chaîne de valeurs numériques séparées par des virgules, et non un mélange de texte et de chiffres.

1 votes

Utiliser array_filter($array, 'is_numeric') mieux, mais il ne peut pas être 100% vrai, parce que '0x539', '0b01011' sont des valeurs numériques.

53voto

MikeWu Points 571

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 crée juste un tableau de 1 million d'entiers aléatoires entre 0 et 100. Ensuite, je les ai fait imploser pour obtenir la chaîne.

  $integers = array();

  for ($i = 0; $i < 1000000; $i++) {
      $integers[] = rand(0, 100);
  }

  $long_string = implode(',', $integers);

Méthode 1 Voici la réponse de Mark :

$integerIDs = array_map('intval', explode(',', $long_string));

Méthode 2

C'est l'approche JSON :

  $integerIDs = json_decode('[' . $long_string . ']', true);

Méthode 3 Je suis arrivé à cette méthode en modifiant la réponse de Mark. Elle utilise toujours explode() mais au lieu d'appeler array_map() J'utilise la méthode normale foreach pour faire le travail afin d'éviter les frais généraux. array_map() pourrait avoir. J'analyse également les données avec (int) vs intval() mais j'ai essayé les deux, et il n'y a pas beaucoup de différence en termes de performances.

  $result_array = array();
  $strings_array = explode(',', $long_string);

  foreach ($strings_array as $each_number) {
      $result_array[] = (int) $each_number;
  }

Résultats :

Method 1        Method 2        Method 3
0.4804770947    0.3608930111    0.3387751579
0.4748001099    0.363986969     0.3762528896
0.4625790119    0.3645150661    0.3335959911
0.5065748692    0.3570590019    0.3365750313
0.4803431034    0.4135499001    0.3330330849
0.4510772228    0.4421861172    0.341176033
0.503674984     0.3612480164    0.3561749458
0.5598649979    0.352314949     0.3766179085
0.4573421478    0.3527538776    0.3473439217

0.4863037268    0.3742785454    0.3488383293

La ligne de fond est la moyenne. Il semble que la première méthode était un peu plus lente pour 1 million d'entiers, mais je n'ai pas remarqué un gain de performance de 3x la méthode 2 comme indiqué dans la réponse. Il s'est avéré que foreach loop était le plus rapide dans mon cas. J'ai fait le benchmarking avec Xdebug.

Edit : Cela fait un moment que la réponse a été postée à l'origine. Pour clarifier, le benchmark a été fait en php 5.6.40.

49voto

sgrodzicki Points 482

C'est presque 3 fois plus rapide que explode() , array_map() y intval() :

$integerIDs = json_decode('[' . $string . ']', true);

1 votes

@Binod votre chaîne a probablement une erreur de syntaxe. Elle devrait être formatée comme ceci : $chaîne = "1,2,3" ;

0 votes

@sgrodzicki.. Vous avez raison Mon erreur..+1'd.. Ce n'était pas des virgules str_replace fera cela.. Je pense que c'est aussi plus rapide n'est-ce pas ?

0 votes

Oui, json_decode() + str_replace() seront toujours plus rapides que explode() + array_map() + intval().

24voto

Andreas Points 1784

Utilisez ce code avec une fermeture (introduite 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 :

// if you have your values in the format '1,2,3,4', use this before:
// $stringArray = explode(',', '1,2,3,4');

$stringArray = ['1', '2', '3', '4'];

$intArray = array_map(
    function($value) { return (int)$value; },
    $stringArray
);

var_dump($intArray);

La sortie sera :

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
}

17voto

Dmitry Dubovitsky Points 377

Dans la solution de Mark, vous retournerez array([0]=> int 0) si vous essayez d'analyser une chaîne de caractères telle que "test".

$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X