将逗号分隔的字符串转换为整数数组?

问题描述 投票:0回答:18

以下代码:

$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
更好的方法?

php arrays string integer explode
18个回答
720
投票

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

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

57
投票

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

准备工作

只需创建一个包含 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

我想出了这个作为对马克答案的修改。这仍然使用

explode()
函数,但我没有调用
array_map()
,而是使用常规
foreach
循环来完成工作,以避免
array_map()
可能产生的开销。我也在用
(int)
vs
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 倍。事实证明

foreach
循环是我的情况下最快的循环。我已经用 Xdebug 完成了基准测试。

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


48
投票

这几乎比

explode()
array_map()
intval()
快 3 倍:

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

26
投票

将此代码与闭包一起使用(在

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

19
投票

在 Mark 的解决方案中,如果您尝试解析诸如“test”之类的字符串,您将返回

array([0]=> int 0)

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

9
投票

另一种更短的方法可能是:

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

与方法3具有相同的性能。


7
投票

我的解决方案是借助回调函数来转换每个值:

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

6
投票

不确定这是否更快,但翻转数组两次会将数字字符串转换为整数:

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

重要:如果您正在处理重复值,请勿使用此功能!


5
投票

PHP 7.4 风格:

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

5
投票

如果你有这样的数组:

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

如果您想将它们转换为整数并保留在数组中,请执行以下操作:

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

3
投票

保持简单...

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

你为什么要寻找其他方法?循环可以毫无痛苦地完成这项工作。如果您关心性能,您可以选择

json_decode ()
。人们已经发布了如何使用它,所以我不会在这里包含它。

注意: 当使用 == 运算符而不是 === 时,如果字符串值形成不带引号的有效数字,则它们会自动转换为数字(例如整数或双精度)。例如:

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

因此, == 可以解决你的问题,很有效,但如果你在比较中使用 === 就会中断。


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]]

这适用于任何深度。

或者,您可以使用

array_walk_recursive()
获得更简短的答案:

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

1
投票
$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);

结果会是这样的

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

0
投票

输入 => '["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)
}

谢谢


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

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

0
投票

我很惊讶没有人提出

filter_var
方法,我不确定它在巨大数据集上的表现如何,但如果你的关键是有效性而不是性能,这里有一个例子:

$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

如您所见,

2 3
不是与
a
相同的有效数字,已被
null

取代

要摆脱空值,您可以应用

array_filter

$filteredValues = array_filter($filteredValues);

这会产生以下结果:

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

0
投票

我给一些读者提供了一个解决方案,我对上面的 Mark Baker 先生的解决方案做了一些修改

对于有数组问题的用户,这里使用 Laravel PHP 是一个调整

$originalArray = $data->pluck('column')->toArray(); 
$convertedString = implode(', ', $originalArray); 
$data = array_map('intval', explode(',', $convertedString ));
    
var_dump($data);

-2
投票

另一种技术是在分解字符串后将输入值提示(强制)为

int
类型。

请注意,除非您将 php 设置为使用严格类型,否则这些技术将按照我的演示链接中演示的方式工作。

以下技术不应用于清理非数字字符串;它假设所有值都是数字。

如果将浮点值传递到这些技术中,它们将被截断/下限为整数。

代码:(演示

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

输出:

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.