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)
小智 39
这几乎快3倍explode(),array_map()并且intval():
$integerIDs = json_decode('[' . $string . ']', true);
Run Code Online (Sandbox Code Playgroud)
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)
这是马克回答的一个班轮:
$integerIDs = array_map('intval', explode(',', $long_string));
Run Code Online (Sandbox Code Playgroud)
这是JSON方法:
$integerIDs = json_decode('[' . $long_string . ']', true);
Run Code Online (Sandbox Code Playgroud)
我想出了这个作为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)
不确定这是否更快但是两次翻转数组会将数字字符串转换为整数:
$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
Run Code Online (Sandbox Code Playgroud)
我的解决方案是在回调函数的帮助下投射每个值:
$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相同的性能。
如果你有像这样的数组:
$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)
PHP 7.4 风格:
$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));
Run Code Online (Sandbox Code Playgroud)