$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
?
$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
?
你可以通过以下代码实现此功能,
$integerIDs = array_map('intval', explode(',', $string));
我对回答中提到的处理大量整数方法的性能感到好奇。
只需创建一个包含 0 到 100 之间的 1 百万个随机整数的数组。然后,将它们压缩成字符串。
$integers = array();
for ($i = 0; $i < 1000000; $i++) {
$integers[] = rand(0, 100);
}
$long_string = implode(',', $integers);
这是Mark答案中的一行代码:
$integerIDs = array_map('intval', explode(',', $long_string));
这是JSON的方法:
$integerIDs = json_decode('[' . $long_string . ']', true);
我将这个方法作为 Mark 答案的修改版提出。仍然使用 explode()
函数,但是不再调用 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
底线是平均数。看起来第一种方法对于1百万个整数的处理速度稍慢,但我并没有注意到答案中所述的第二种方法有3倍的性能提升。结果证明,在我的情况下,foreach
循环是最快的。我使用了Xdebug进行基准测试。
编辑:自答案最初发布以来已经有一段时间了。为了澄清,这个基准测试是在php 5.6.40中完成的。
array_map(function($v){ return (int)$v; }, $strings_array);
这就是我的意思。 - jave.web$string =“1,2,3”
,这意味着起始点是一个逗号分隔的整数字符串。 - MikeWu这比explode()
、array_map()
和intval()
快近3倍:
$integerIDs = json_decode('[' . $string . ']', true);
float
类型而不仅仅是整数,这个答案也是有效的,而你们可能没有意识到这一点。 - StefansArya使用闭包(在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)
}
在Mark的解决方案中,如果您尝试解析像"test"这样的字符串,您将返回array([0]=> int 0)
。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
它的表现与方法3相同。
我的解决方案是利用回调函数将每个值强制转换:
$ids = array_map( function($value) { return (int)$value; }, $ids )
不确定这样做是否更快,但是将数组翻转两次会将数字字符串转换为整数:
$string = "1,2,3,bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
重要提示:如果您处理的是重复值,请勿使用此选项!
bla
转换为整数,所以它是不正确的,我必须DV。这个答案不能满足问题标题。 - mickmackusa$runners = ["1","2","3","4"];
如果您想将它们转换为整数并保留在数组中,可以使用以下方法:
$newArray = array_map( create_function('$value', 'return (int)$value;'),
$runners);
create_function
已被弃用,您可以改为使用以下代码:$newArray = array_map(fn($value) => (int) $value, $runners)
- bderetaPHP 7.4 风格:
$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));