以下代码:

$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而不是类型字符串。有没有更好的方法来做到这一点比循环通过数组与foreach和转换每个字符串为int?


当前回答

所以我很好奇答案中提到的一些方法对于大量整数的性能。

准备

只是创建一个100万个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

我根据马克的回答提出了这个问题。这仍然使用了explosion()函数,但是我没有调用array_map(),而是使用常规的foreach循环来完成这项工作,以避免array_map()可能带来的开销。我还使用(int)和intval()进行解析,但我都尝试了,在性能方面没有太大差异。

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

结果

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

底线是平均值。对于100万个整数,第一种方法看起来有点慢,但我没有注意到答案中所述的方法2的性能提高了3倍。对我来说,每一个循环都是最快的。我已经用Xdebug完成了基准测试。

编辑:从最初的答案发布到现在已经有一段时间了。为了澄清,基准测试是在php 5.6.40中完成的。

其他回答

使用这个代码和一个闭包(在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)
}

所以我很好奇答案中提到的一些方法对于大量整数的性能。

准备

只是创建一个100万个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

我根据马克的回答提出了这个问题。这仍然使用了explosion()函数,但是我没有调用array_map(),而是使用常规的foreach循环来完成这项工作,以避免array_map()可能带来的开销。我还使用(int)和intval()进行解析,但我都尝试了,在性能方面没有太大差异。

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

结果

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

底线是平均值。对于100万个整数,第一种方法看起来有点慢,但我没有注意到答案中所述的方法2的性能提高了3倍。对我来说,每一个循环都是最快的。我已经用Xdebug完成了基准测试。

编辑:从最初的答案发布到现在已经有一段时间了。为了澄清,基准测试是在php 5.6.40中完成的。

PHP 7.4风格:

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

你可以通过以下代码来实现这一点,

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

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

类型转换我使用=> (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"]'));

输出:

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

谢谢