how to convert array values from string to int?

匿名 (未验证) 提交于 2019-12-03 02:12:02

问题:

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

returns

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

I need for the values to be of type int instead of type string. Is there a better way of doing this than looping through the array with a foreach and converting each string to int?

回答1:

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


回答2:

This is almost 3 times faster than explode(), array_map() and intval():

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


回答3:

So I was curious about the performance of some of the methods mentioned in the answers for large number of integers.

Preparation

Just creating an array of 1 million random integers between 0 and 100. Than, I imploded them to get the string.

  $integers = array();    for ($i = 0; $i 

Method 1

This is the one liner from Mark's answer:

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

Method 2

This is the JSON approach:

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

Method 3

I came up with this one as modification of Mark's answer. This is still using explode() function, but instead of calling array_map() I'm using regular foreach loop to do the work to avoid the overhead array_map() might have. I am also parsing with (int) vs intval(), but I tried both, and there is not much difference in terms of performance.

  $result_array = array();   $strings_array = explode(',', $long_string);    foreach ($strings_array as $each_number) {       $result_array[] = (int) $each_number;   } 

Results:

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 

The bottom line is the average. It looks like the first method was a little slower for 1 million integers, but I didn't notice 3x performance gain of Method 2 as stated in the answer. It turned out foreach loop was the quickest one in my case. I've done the benchmarking with Xdebug.



回答4:

Use this code with a closure (introduced in PHP 5.3), it's a bit faster than the accepted answer and for me, the intention to cast it to an integer, is clearer:

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

Output will be:

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


回答5:

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

In Mark's solution, you will return array([0]=> int 0) if you try to parse a string such as "test".



回答6:

If you have array like:

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

And if you want to covert them into integers and keep within array, following should do the job:

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


回答7:

Not sure if this is faster but flipping the array twice will cast numeric strings to integers:

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


回答8:

Keep it simple...

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

Why are you looking for other ways? Looping does the job without pain. If performance is your concern, you can go with json_decode (). People have posted how to use that, so I am not including it here.

Note: When using == operator instead of === , your string values are automatically converted into numbers (e.g. integer or double) if they form a valid number without quotes. For example:

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

Thus, == may solve your problem, is efficient, but will break if you use === in comparisons.



回答9:

An alternative shorter method could be:

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

It has the same performance as Method 3.



回答10:

If you have a multi-dimentional array, none of the previously mentioned solutions will work. Here is my solution:

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

Then, just do this:

arrayValuesToInt($multiDimentionalArray); 

This will make an array like this:

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

look like this:

[[1,2][3,4] 

(This will work with any level of depth)



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!