如何将数组值从字符串转换为int?

cwa*_*wal 219 php string int explode

$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
Run Code Online (Sandbox Code Playgroud)

回报

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
Run Code Online (Sandbox Code Playgroud)

我需要的值是int类型而不是string类型.有没有比使用foreach循环数组并将每个字符串转换为int更好的方法?

Mar*_*ker 496

$integerIDs = array_map('intval', explode(',', $string));
Run Code Online (Sandbox Code Playgroud)

  • @Dmitry - 如果你想批评一个18个月的特定问题的答案,因为它在每个可以想象的环境中并不完美,并且认为你有更好的解决方案,那么随意添加你自己的答案来解决这个问题,解释为什么你的答案更好......没有人阻止你......但是保留这个答案 (31认同)
  • @Dmitry - 这是对的......这是对OP问题的回答,而不是在每种情况下100%完美回答每个潜在的相关问题.OP有一串逗号分隔的数值,而不是文本和数字的选择和混合 (10认同)
  • 但是如果你有字符串 'test',你会得到: array([0]=> 0 ) (4认同)

小智 39

这几乎快3倍explode(),array_map()并且intval():

$integerIDs = json_decode('[' . $string . ']', true);
Run Code Online (Sandbox Code Playgroud)

  • 海事组织.这导致代码混淆 (13认同)
  • explode()+ array_map()+ intval()可能没有json_decode()那么快,但它显然不是更好的选择...你需要处理其他东西,如json语法错误,当你是消毒用户输入 (4认同)
  • 这只是微优化.没有必要优化这样一个微小的操作,如将一个填充了字符串的数组转换为整数.如果你的数组包含大量的元素(例如成千上万的元素),那么你的项目中的另一个更大的问题就是这个操作. (3认同)
  • 这太可怕了,尤其是当它比 map + to_int 还快时!php,它怎么能走到那么远...... (2认同)
  • 任何技巧都可能是有效的,尤其是关于性能优化的技巧。实际上,如果您想转换为“浮点数”而不仅仅是“整数”,那么这个答案也有效,而你们没有意识到这一点。 (2认同)

Mik*_*eWu 39

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

制备

只需创建一个介于0到100之间的100万个随机整数的数组.然后,我破坏它们获取字符串.

  $integers = array();

  for ($i = 0; $i < 1000000; $i++) {
      $integers[] = rand(0, 100);
  }

  $long_string = implode(',', $integers);
Run Code Online (Sandbox Code Playgroud)

方法1

这是马克回答的一个班轮:

$integerIDs = array_map('intval', explode(',', $long_string));
Run Code Online (Sandbox Code Playgroud)

方法2

这是JSON方法:

  $integerIDs = json_decode('[' . $long_string . ']', true);
Run Code Online (Sandbox Code Playgroud)

方法3

我想出了这个作为Mark答案的修改.这仍然是使用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;
  }
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

底线是平均值.对于100万个整数来说,第一种方法看起来有点慢,但我没有注意到方法2的3倍性能增益,如答案中所述.事实证明,foreach在我的情况下,循环是最快的.我已经用Xdebug完成了基准测试.


And*_*eas 16

将此代码与闭包(介绍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);
Run Code Online (Sandbox Code Playgroud)

输出将是:

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*sky 13

array([0]=> int 0)

在Mark的解决方案中,array([0]=> int 0)如果您尝试解析诸如"test"之类的字符串,则会返回.


bai*_*kho 7

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

$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
Run Code Online (Sandbox Code Playgroud)


The*_*eva 7

我的解决方案是在回调函数的帮助下投射每个值:

$ids = array_map( function($value) { return (int)$value; }, $ids )
Run Code Online (Sandbox Code Playgroud)


小智 6

一种替代的较短方法可以是:

$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
Run Code Online (Sandbox Code Playgroud)

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


sta*_*bit 5

如果你有像这样的数组:

$runners = ["1","2","3","4"];
Run Code Online (Sandbox Code Playgroud)

如果你想将它们转换成整数并保持在数组中,那么下面应该做的工作:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);
Run Code Online (Sandbox Code Playgroud)


Jul*_*ien 5

PHP 7.4 风格:

$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));
Run Code Online (Sandbox Code Playgroud)