jak przekonwertować wartości tablicy z string na int?

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

Zwraca

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

Chcę, aby wartości były typu int zamiast typu string. Czy istnieje lepszy sposób na zrobienie tego niż zapętlenie tablicy za pomocą foreach i przekształcenie każdego ciągu znaków w int?

Author: JohnRDOrazio, 2012-03-07

10 answers

$integerIDs = array_map('intval', explode(',', $string));
 402
Author: Mark Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 23:55:27

To prawie 3 razy szybciej niż explode(), array_map() i intval():

$integerIDs = json_decode('[' . $string . ']', true);
 32
Author: sgrodzicki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-16 09:39:27

Byłem więc ciekaw wydajności niektórych metod wymienionych w odpowiedziach dla dużej liczby liczb całkowitych.

Przygotowanie

Po prostu tworzymy tablicę 1 miliona losowych liczb całkowitych z zakresu od 0 do 100. Potem implodowałem je, żeby zdobyć sznurek.

  $integers = array();

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

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

Metoda 1

Oto jedyna linijka z odpowiedzi Marka:

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

Metoda 2

To jest podejście JSON:

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

Metoda 3

Wymyśliłem to jako modyfikacja odpowiedzi Marka. W dalszym ciągu używa się funkcji explode(), ale zamiast wywoływać array_map() używam zwykłej pętli foreach, aby uniknąć napowietrznego działania array_map(). Analizuję również (int) vs intval(), ale próbowałem obu i nie ma dużej różnicy pod względem wydajności.

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

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

Wyniki:

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

W dolnej linii jest średnia. Wygląda na to, że pierwsza metoda była trochę wolniejsza dla 1 miliona liczb całkowitych, ale nie zauważyłem 3x zwiększenia wydajności Metoda 2, Jak podano w odpowiedzi. Okazało się, że pętla była najszybsza w moim przypadku. Zrobiłem benchmarking z Xdebug.

 24
Author: MikeWu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-01 23:50:25

Użyj tego kodu z zamknięciem (wprowadzonym w PHP 5.3), jest on nieco szybszy od zaakceptowanej odpowiedzi i dla mnie zamiar wrzucenia go do liczby całkowitej jest jaśniejszy:

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

Wyjście będzie:

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
}
 15
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 14:29:37

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

W rozwiązaniu Mark 'a, zwrócisz array([0]=> int 0), jeśli spróbujesz przetworzyć ciąg znaków ,taki jak"test".

 9
Author: Dmitry Dubovitsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 08:46:54

Jeśli masz tablicę typu:

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

I jeśli chcesz ukryć je w liczbach całkowitych i zachować w tablicy, wykonaj następujące zadanie:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);
 4
Author: star18bit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 11:54:10

Nie wiem, czy jest to szybsze, ale dwukrotne odwrócenie tablicy spowoduje wyświetlenie ciągów liczbowych na liczby całkowite:

$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
 4
Author: Baik Ho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 11:16:13

To proste...

$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);
Dlaczego szukasz innych sposobów? Zapętlenie działa bez bólu. Jeśli zależy ci na wydajności, możesz wybrać json_decode (). Ludzie napisali jak z tego korzystać, więc nie zamieszczam tego tutaj.

Uwaga: podczas używania operatora = = zamiast===, wartości łańcuchów są automatycznie konwertowane na liczby (np. integer lub double), jeśli tworzą poprawną liczbę bez cudzysłowów. Na przykład:

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

Tak więc, = = może rozwiązać twój problem, jest wydajny, ale złamie się, jeśli użyjesz = = = w porównaniach.

 2
Author: Devashish Jaiswal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 07:46:26

Alternatywną metodą krótszą może być:

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

Ma taką samą wydajność jak Metoda 3.

 2
Author: MyGeertRo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 13:25:51

Jeśli macie macierz wielowymiarową, żadne z wyżej wymienionych rozwiązań nie zadziała. Oto moje rozwiązanie:

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

Więc zrób to:

arrayValuesToInt($multiDimentionalArray);

To utworzy tablicę taką jak:

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

Wygląda tak:

[[1,2][3,4]

(będzie to działać z dowolnym poziomem głębokości)

 1
Author: Skeets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 05:54:10