Konvertieren Sie eine durch Kommas getrennte Zeichenfolge in ein Array von Ganzzahlen?

Lesezeit: 6 Minuten

Benutzer-Avatar
cwal

Der folgende Code:

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

Gibt das Array zurück:

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

Ich brauche für die Werte vom Typ sein int statt Typ string. Gibt es eine bessere Möglichkeit, dies zu tun, als das Array mit zu durchlaufen? foreach und jeweils umwandeln string zu int?

  • Für Forscher, die nach einer Lösung suchen, die für multidimensionale Daten geeignet ist, lesen Sie bitte diese ähnliche Frage: stackoverflow.com/questions/27147105/…

    – mickmackusa

    14. Oktober 2020 um 3:02 Uhr

Benutzer-Avatar
Markus Bäcker

Sie können dies erreichen, indem Sie den folgenden Code ausführen:

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

  • aber wenn Sie die Zeichenfolge ‘test’ haben, erhalten Sie: array([0]=> 0 )

    – Dmitri Dubowizki

    9. Oktober 2013 um 13:39 Uhr

  • @Dmitry – das ist richtig … es ist eine Antwort auf die Frage des OP, nicht in jedem Fall eine 100% perfekte Antwort auf jede mögliche verwandte Frage. OP hatte eine Reihe von durch Kommas getrennten numerischen Werten, keine Pick-and-Mischung aus Text und Zahlen

    – Markus Bäcker

    9. Oktober 2013 um 13:46 Uhr

  • Verwenden Sie array_filter($array, ‘is_numeric’) besser, aber es kann nicht 100% wahr sein, weil ‘0x539’, ‘0b01011’ numerische Werte sind.

    – Dmitri Dubowizki

    9. Oktober 2013 um 14:07 Uhr

  • @Dmitry – Wenn Sie eine 18 Monate alte Antwort auf eine bestimmte Frage kritisieren möchten, weil sie nicht unter allen denkbaren Umständen perfekt ist, und glauben, dass Sie eine bessere Lösung haben, können Sie dieser Frage gerne Ihre eigene Antwort hinzufügen und erklären warum Ihre Antwort besser ist … niemand hält Sie auf … aber lassen Sie diese Antwort so, wie sie ist

    – Markus Bäcker

    9. Oktober 2013 um 14:10 Uhr


  • Intervall() ist weniger leistungsfähiger als (int) gießen. Verwenden Sie also besser eine andere Lösung mit (int). siehe Methode 3 hier

    – fabelhaft

    19. April 2016 um 7:24 Uhr

Benutzer-Avatar
Mike Wu

Daher war ich neugierig auf die Leistung einiger der in den Antworten erwähnten Methoden für eine große Anzahl von Ganzzahlen.

###Vorbereitung

Ich habe nur ein Array von 1 Million zufälligen Ganzzahlen zwischen 0 und 100 erstellt. Dann habe ich sie implodiert, 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 aus 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 mir diese als Modifikation von Marks Antwort ausgedacht. Dies wird immer noch verwendet explode() Funktion, sondern anstatt aufzurufen array_map() Ich benutze regelmäßig foreach Schleife, um die Arbeit zu erledigen und den Overhead zu vermeiden array_map() könnte haben. Ich parse auch mit (int) vs intval()aber ich habe beide ausprobiert, 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

Das Endergebnis ist der Durchschnitt. Es sieht so aus, als wäre die erste Methode für 1 Million Ganzzahlen etwas langsamer, aber ich habe den 3-fachen Leistungsgewinn von Methode 2 nicht bemerkt, wie in der Antwort angegeben. Es stellte sich heraus foreach Schleife war in meinem Fall die schnellste. Ich habe das Benchmarking mit Xdebug durchgeführt.

Bearbeiten: Es ist eine Weile her, seit die Antwort ursprünglich gepostet wurde. Zur Verdeutlichung wurde der Benchmark in PHP 5.6.40 durchgeführt.

  • Ich frage mich wirklich, ob die Leistung in PHP 7 gleich geblieben ist, und noch neugieriger, wie Methode 1 array_map in Kombination mit Methode 3-Casting und -Closure/anonymem Callback funktionieren würde …

    – jave.web

    12. Oktober 2018 um 19:27 Uhr

  • array_map(function($v){ return (int)$v; }, $strings_array); das meinte ich

    – jave.web

    12. Oktober 2018 um 19:44 Uhr

  • Ich habe einige Tests auf PHP7.2 mit foreach (Methode 1), array_map mit ‘intval’ (Methode 2) und array_map mit anonymer Funktion (Methode 3) in einem Array mit 10000000 Elementen durchgeführt. Ich kam zu dem Ergebnis, dass meine Methode 2 schneller ist (~ 0,6 s), dann Methode 3 (~ 0,75 s), dann Methode 1 (~ 1,1 s)

    – Gabriel Lima

    5. März 2020 um 14:03 Uhr

  • Verschiedene Methoden, die von den Antworten in diesem Beitrag bereitgestellt werden, beantworten nicht die Frage, die im Titel gestellt wurde, und alle 300.000 Menschen, die diesen Beitrag besuchten, waren falsch informiert. Und ja, solche Beiträge machen so ziemlich den Stand der PHP-Community aus.

    – Ihr gesunder Menschenverstand

    2. Juni um 18:51 Uhr


  • Die OP-Frage ist Convert a comma-delimited string into array of integers?. Ich denke, mein Verständnis davon ist Convert a string of comma-delimited integers into array of integers (was im Einklang mit dem Verständnis dieser Frage durch andere Antwortende zu stehen scheint). Sie behaupten, die Frage sei Convert array values from string to int. Nirgendwo im OP-Post sehe ich, dass er mit einem Array beginnt. Ich verstehe $string = "1,2,3" in der ersten Codezeile, was bedeuten würde, dass der Startpunkt eine Zeichenfolge aus kommagetrennten Ganzzahlen ist.

    – Mike Wu

    2. Juni um 19:00 Uhr


Benutzer-Avatar
sgrodzicki

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

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

  • @Binod Ihre Zeichenfolge hat wahrscheinlich einen Syntaxfehler. Es sollte wie folgt formatiert sein: $string = “1,2,3”;

    – sgrodzicki

    7. Mai 2013 um 18:00 Uhr


  • explode () + array_map () + intval () ist möglicherweise nicht so schnell wie json_decode (), aber es ist eindeutig nicht die bessere Option … Sie müssen andere Dinge wie json-Syntaxfehler behandeln, die wahrscheinlich sind, wenn Sie es sind Benutzereingaben bereinigen

    – staabm

    28. März 2014 um 11:11 Uhr

  • das ist schrecklich, besonders wenn es schneller ist als eine map + to_int! php, wie konnte es so weit kommen…

    – phoet

    17. Juni 2015 um 7:26 Uhr

  • Das ist nur Mikrooptimierung. Es besteht keine Notwendigkeit, eine so kleine Operation wie das Umwandeln eines mit Strings gefüllten Arrays in Ganzzahlen zu optimieren. Und wenn Ihr Array sehr viele Elemente enthält (z. B. Hunderttausende von Elementen), dann gibt es in Ihrem Projekt ein anderes, viel größeres Problem als diese Operation.

    –Andreas

    5. Dezember 2016 um 10:57 Uhr

  • Jeder Trick könnte gültig sein, besonders wenn es um die Leistungsoptimierung geht. Eigentlich gilt diese Antwort auch, wenn Sie umwandeln möchten float Nummer und nicht nur zu integerund ihr habt es nicht bemerkt.

    – StefansArya

    3. Januar 2019 um 1:06 Uhr

Verwenden Sie diesen Code mit einem Abschluss (eingeführt in PHP 5.3), es ist etwas schneller als die akzeptierte Antwort und für mich ist die Absicht, es 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)
}

Benutzer-Avatar
Dmitri Dubowizki

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

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

Benutzer-Avatar
MyGeertRo

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.

Benutzer-Avatar
Theva

Meine Lösung besteht darin, jeden Wert mit Hilfe der Callback-Funktion umzuwandeln:

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

  • $ids = \array_map(fn(string $id): int => (int) $id, $ids); – noch schöner mit PHP 7.4+

    – Elliot Reed

    3. Juli 2020 um 13:30 Uhr

  • Einfacher und effektiver Einzeiler. Vielen Dank!

    – Iwan

    11. Oktober 2020 um 12:12 Uhr

1018900cookie-checkKonvertieren Sie eine durch Kommas getrennte Zeichenfolge in ein Array von Ganzzahlen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy