как преобразовать значения массива из 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 ответов
Это почти в 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]
(это будет работать с любым уровнем глубины)