Convert array values from string to int?

PhpArraysStringIntegerExplode

Php Problem Overview


The following code:

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

Returns the array:

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 foreach and converting each string to int?

Php Solutions


Solution 1 - Php

You can achieve this by following code,

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

Solution 2 - Php

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 < 1000000; $i++) {
      $integers[] = rand(0, 100);
  }

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

###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.

Edit: It's been a while since the answer was originally posted. To clarify, the benchmark was done in php 5.6.40.

Solution 3 - Php

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

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

Solution 4 - Php

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)
}

Solution 5 - Php

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

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

Solution 6 - Php

An alternative shorter method could be:

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

It has the same performance as Method 3.

Solution 7 - Php

My solution is casting each value with the help of callback function:

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

Solution 8 - Php

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

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

Important: Do not use this if you are dealing with duplicate values!

Solution 9 - Php

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

Solution 10 - Php

PHP 7.4 style:

$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));

Solution 11 - Php

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.

Solution 12 - Php

If you have a multi-dimensional 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.

Alternatively, you can use array_walk_recursive() for a shorter answer:

array_walk_recursive($array, function(&$value){
    $value = intval($value);
});

Solution 13 - Php

$arr = ["adfsf", "*&^%$#^", "23", "25", "29"];

function convertArrayStringToArrayInt($arr)
{
    $result = [];
    foreach($arr as $value) {
        if ((int)$value !== 0) {
            $result[] = (int)$value;
        }
    }
    return $result;
}

$result = convertArrayStringToArrayInt($arr);

var_dump($result);

The result will be like this

array(3) {
  [0]=> int(23)
  [1]=> int(25)
  [2]=> int(29)
}

Solution 14 - Php

Input => '["3","6","16","120"]'

Type conversion I used => (int)$s;

function Str_Int_Arr($data){
    $h=[];
    $arr=substr($data,1,-1);
    //$exp=str_replace( ",","", $arr);
    $exp=str_replace( "\"","", $arr);
    $s=''; 
    $m=0;
    foreach (str_split($exp) as $k){
        if('0'<= $k && '9'>$k || $k =","){
            if('0' <= $k && '9' > $k){
                $s.=$k;
                $h[$m]=(int)$s;
            }else{
                $s="";
                $m+=1;
            } 
        } 
    } 
    return $h;
}
var_dump(Str_Int_Arr('["3","6","16","120"]'));

Output:

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

Thanks

Solution 15 - Php

<?php
    
$string = "1,2,3";
$ids = explode(',', $string );

array_walk( $ids, function ( &$id )
{
    $id = (int) $id;
});
var_dump( $ids );

Solution 16 - Php

I'm surprised no one proposed filter_var method, I'm not sure how well it performs on huge datasets, but if your key is validity over performance here is an example:

$sampleString = '1,2 3, 4, 6, 5 , a';
$filteredValues = filter_var(
     explode(',', $sampleString),
     FILTER_VALIDATE_INT,
     FILTER_NULL_ON_FAILURE | FILTER_FORCE_ARRAY
);
array (size=6)
  0 => int 1
  1 => null
  2 => int 4
  3 => int 6
  4 => int 5
  5 => null

As you can see 2 3 is not a valid number same as a and were replaced by null

To get rid of empty values you can apply array_filter

$filteredValues = array_filter($filteredValues);

which would produce following result:

array (size=4)
  0 => int 1
  2 => int 4
  3 => int 6
  4 => int 5

Solution 17 - Php

Another technique is to type-hint (coerce) the incoming values to int type after exploding the string.

Note that these techniques will work as demonstrated in my demo link unless you have set php to use strict typing.

The following techniques should not be used to sanitize non-numeric strings; it assumes that all values will be numeric.

If float values are passed into these techniques, they will be truncated/floored to integers.

Code: (Demo)

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

echo "\n---\n";
array_walk($array, function(int &$int){;});
var_dump($array);

echo "\n---\n";
var_dump(
    array_map(function(int $i){ return $i; }, explode(',', $string))
);

echo "\n---\n";
var_dump(
    array_map(fn(int $i) => $i, explode(',', $string)) // PHP 7.4 arrow function syntax
);

Output:

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

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

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncwalView Question on Stackoverflow
Solution 1 - PhpMark BakerView Answer on Stackoverflow
Solution 2 - PhpMikeWuView Answer on Stackoverflow
Solution 3 - PhpsgrodzickiView Answer on Stackoverflow
Solution 4 - PhpAndreasView Answer on Stackoverflow
Solution 5 - PhpDmitry DubovitskyView Answer on Stackoverflow
Solution 6 - PhpMyGeertRoView Answer on Stackoverflow
Solution 7 - PhpThevaView Answer on Stackoverflow
Solution 8 - PhpbaikhoView Answer on Stackoverflow
Solution 9 - PhpDPPView Answer on Stackoverflow
Solution 10 - PhpJulienView Answer on Stackoverflow
Solution 11 - Phpuser5818995View Answer on Stackoverflow
Solution 12 - PhpSkeetsView Answer on Stackoverflow
Solution 13 - Phpđức chung nguyễnView Answer on Stackoverflow
Solution 14 - PhpRajaView Answer on Stackoverflow
Solution 15 - PhpAl-AminView Answer on Stackoverflow
Solution 16 - PhpNazariyView Answer on Stackoverflow
Solution 17 - PhpmickmackusaView Answer on Stackoverflow