как преобразовать значения массива из string в int?

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

возвращает

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

мне нужно, чтобы значения имели тип int вместо типа string. Есть ли лучший способ сделать это, чем цикл по массиву с помощью foreach и преобразования string в int?

10 ответов


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

Это почти в 3 раза быстрее, чем explode(), array_map() и intval():

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

поэтому мне было интересно узнать о производительности некоторых методов, упомянутых в ответах на большое количество целых чисел.

подготовка

просто создание массива из 1 миллиона случайных целых чисел от 0 до 100. Тан, Я взорвал их, чтобы получить веревку.

  $integers = array();

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

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

Способ 1

это один лайнер из ответа Марка:

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

Способ 2

это JSON подход:

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

Способ 3

я придумал это как модификацию ответа Марка. Это все еще использует


используйте этот код с закрытием (введено в PHP 5.3), это немного быстрее, чем принятый ответ, и для меня намерение привести его к целому числу яснее:

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

результат должен выглядеть так:

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

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

в решении Марка вы вернетесь array([0]=> int 0) Если вы пытаетесь проанализировать строку, такую как"test".


Если у вас есть массив вида:

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

и если вы хотите скрыть их в целые числа и сохранить в массиве, следующее должно выполнить эту работу:

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

Не уверен, что это быстрее, но переворачивание массива дважды приведет к приведению числовых строк к целым числам:

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

сохранить его простым...

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

почему вы ищете другие пути? Петля делает работу без боли. Если производительность ваша забота, вы можете пойти с json_decode (). Люди опубликовали, как это использовать, поэтому я не включаю его здесь.

Примечание: при использовании оператора == вместо = = = строковые значения автоматически преобразуются в числа (например, integer или double), если они образуют допустимое число без кавычек. Для пример:

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

таким образом, = = может решить вашу проблему, эффективен, но сломается, если вы используете === в сравнениях.


альтернативным более коротким методом может быть:

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

Он имеет ту же производительность, что и Метод 3.


если у вас есть мульти-мерного массива, ни один из этих решений будет работать. Вот мое решение:

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

тогда просто сделайте так:

arrayValuesToInt($multiDimentionalArray);

это сделает массив следующим образом:

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

выглядит так:

[[1,2][3,4]

(это будет работать с любым уровнем глубины)