$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循环遍历数组并将每个字符串转换为int?
更好的方法答案 0 :(得分:459)
您可以通过以下代码
来实现这一目标$integerIDs = array_map('intval', explode(',', $string));
答案 1 :(得分:37)
这几乎是explode()
,array_map()
和intval()
的3倍:
$integerIDs = json_decode('[' . $string . ']', true);
答案 2 :(得分:32)
所以我很好奇大量整数答案中提到的一些方法的性能。
只需要创建一个介于0到100之间的100万个随机整数的数组。然后,我将它们破坏以获取字符串。
$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)
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中完成的。
答案 3 :(得分: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);
输出将是:
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
答案 4 :(得分:11)
在Mark的解决方案中,如果您尝试解析诸如“test”之类的字符串,则会返回array([0]=> int 0)
。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
答案 5 :(得分:7)
不确定这是否更快但是两次翻转数组会将数字字符串转换为整数:
$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
答案 6 :(得分:5)
如果你有像这样的数组:
$runners = ["1","2","3","4"];
如果你想将它们转换为整数并保持在数组中,以下应该完成这项工作:
$newArray = array_map( create_function('$value', 'return (int)$value;'),
$runners);
答案 7 :(得分:5)
另一种较短的方法可能是:
$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
它具有与方法3相同的性能。
答案 8 :(得分:3)
保持简单......
$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);
你为什么要寻找其他方法?循环工作没有痛苦。如果您关注性能,可以使用json_decode ()
。人们已经发布了如何使用它,所以我不在这里。
注意:当使用==运算符而不是===时,如果字符串值形成没有引号的有效数字,则会自动将其转换为数字(例如整数或双精度数)。例如:
$str = '1';
($str == 1) // true but
($str === 1) //false
因此,==可以解决你的问题,效率很高,但如果你在比较中使用===就会中断。
答案 9 :(得分:3)
PHP 7.4样式:
$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));
答案 10 :(得分:3)
我的解决方案是借助回调函数来投射每个值:
$ids = array_map( function($value) { return (int)$value; }, $ids )
答案 11 :(得分:2)
如果你有一个多维阵列,前面提到的解决方案都不会起作用。这是我的解决方案:
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]
(这适用于任何深度)
答案 12 :(得分:0)
您可以转换数组中的值:
<?php
$ids = explode(',', $strings);
foreach ($ids as $index => $value) {
$ids[$index] = (int)$value;
}
您还可以将explode
函数的返回值返回到$strings
并对其进行迭代,而不是使用另一个变量($ ids)。
我认为这种解决方案是性能最佳的最安全方法。
答案 13 :(得分: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)
}
谢谢
答案 14 :(得分:0)
<?php
$string = "1,2,3";
$ids = explode(',', $string );
array_walk( $ids, function ( &$id )
{
$id = (int) $id;
});
var_dump( $ids );
答案 15 :(得分:0)
$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)
}
答案 16 :(得分:-2)
另一种技术是在字符串爆炸后将输入的值键入(强制)为int
类型。
请注意,除非您拥有set php to use strict typing,否则这些技术将按照我的演示链接中的说明起作用。
不应使用以下技术来清理非数字字符串;假定所有值都是数字。
如果将float值传递到这些技术中,它们将被截断/填充为整数。
代码:(Demo)
$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)
}