wake-up-neo.com

wie konvertiere ich Array-Werte von String in Int?

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

kehrt zurück 

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}

Ich brauche, dass die Werte vom Typ int und nicht vom Typ string sind. Gibt es eine bessere Möglichkeit, dies zu tun, als das Array mit einem foreach zu durchlaufen und jeden String in int zu konvertieren?

192
cwal
$integerIDs = array_map('intval', explode(',', $string));
437
Mark Baker

Dies ist fast dreimal schneller als explode(), array_map() und intval():

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

Daher war ich neugierig auf die Leistung einiger der in den Antworten für eine große Anzahl von Zahlen genannten Methoden.

Vorbereitung

Erstellen Sie einfach ein Array aus 1 Million zufälligen Ganzzahlen zwischen 0 und 100. Als ich implodierte ich sie, um die Zeichenfolge zu erhalten.

  $integers = array();

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

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

Methode 1

Dies ist der eine Liner von Marks Antwort: 

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

Methode 2

Dies ist der JSON-Ansatz:

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

Methode 3

Ich habe es als Modifikation von Marks Antwort gefunden. Dies verwendet immer noch die Funktion explode(), aber statt array_map() aufzurufen, verwende ich eine normale foreach-Schleife, um die Arbeit zu erledigen, um den Mehraufwand zu vermeiden, den array_map() möglicherweise hat. Ich analysiere auch mit (int) vs intval(), aber ich habe beides versucht, und es gibt keinen großen Unterschied in Bezug auf die Leistung. 

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

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

Ergebnisse: 

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

Die Quintessenz ist der Durchschnitt. Es scheint, dass die erste Methode für 1 Million ganze Zahlen etwas langsamer war, aber ich habe keinen dreifachen Leistungszuwachs der Methode 2 bemerkt, wie in der Antwort angegeben. Es stellte sich heraus, dass foreach die Schleife in meinem Fall die schnellste war. Ich habe das Benchmarking mit Xdebug gemacht.

29
MikeWu

Verwenden Sie diesen Code mit einem Abschluss (eingeführt in PHP 5.3), er ist etwas schneller als die akzeptierte Antwort und für mich ist die Absicht, ihn in eine Ganzzahl umzuwandeln, klarer:

// 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);

Ausgabe wird sein:

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

In Marks Lösung geben Sie array([0]=> int 0) zurück, wenn Sie versuchen, eine Zeichenfolge wie "test" zu analysieren.

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

Wenn Sie nicht sicher sind, ob dies schneller ist, das Array jedoch zweimal umgedreht wird, werden numerische Zeichenfolgen in Ganzzahlen umgewandelt:

$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
5
Baik Ho

Wenn Sie ein Array haben wie: 

$runners = ["1","2","3","4"];

Und wenn Sie sie in ganze Zahlen umwandeln möchten und sich innerhalb des Arrays befinden möchten, sollten Sie Folgendes tun:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);
5
star18bit

Eine alternative kürzere Methode könnte sein:

$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;

Es hat die gleiche Leistung wie Methode 3.

4
MyGeertRo

Halte es einfach...

$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);

Warum suchst du nach anderen Wegen? Looping erledigt die Arbeit ohne Schmerzen. Wenn Leistung Ihr Anliegen ist, können Sie mit json_decode () fortfahren. Die Leute haben gepostet, wie man das benutzt, also schließe ich es hier nicht ein.

Hinweis: Wenn Sie den Operator == anstelle von === verwenden, werden Ihre Zeichenfolgenwerte automatisch in Zahlen konvertiert (z. B. Integer oder Double), wenn sie eine gültige Zahl ohne Anführungszeichen bilden. Zum Beispiel:

$str = '1';
($str == 1) // true but
($str === 1) //false

Somit kann == Ihr Problem lösen, ist effizient, bricht jedoch ab, wenn Sie === in Vergleichen verwenden.

2

Wenn Sie ein multidimensionales Array haben, funktioniert keine der zuvor genannten Lösungen. Hier ist meine Lösung:

public function arrayValuesToInt(&$array){
  if(is_array($array)){
    foreach($array as &$arrayPiece){
      arrayValuesToInt($arrayPiece);
    }
  }else{
    $array = intval($array);
  }
}

Dann mach einfach das:

arrayValuesToInt($multiDimentionalArray);

Dadurch wird ein Array wie folgt erstellt:

[["1","2"]["3","4"]]

sieht aus wie das:

[[1,2][3,4]

(Dies funktioniert mit jeder Tiefe)

1
Skeets

Meine Lösung besteht darin, jeden Wert mit Hilfe der Rückruffunktion umzuwandeln:

$ids = array_map( function($value) { return (int)$value; }, $ids )
1
Theva

Sie können Werte im Array konvertieren:

<?php

$ids = explode(',', $strings);
foreach ($ids as $index => $value) {
    $ids[$index] = (int)$value;
}

Sie können den Rückgabewert der explode-Funktion auch an $strings zurückgeben und ihn wiederholen, anstatt eine andere Variable ($ ids) zu verwenden.

Ich denke, diese Lösung ist der sicherste Weg mit der besten Leistung.

0
Roham Rafii