以下代码:
$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而不是类型字符串。有没有更好的方法来做到这一点比循环通过数组与foreach和转换每个字符串为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而不是类型字符串。有没有更好的方法来做到这一点比循环通过数组与foreach和转换每个字符串为int?
当前回答
我的解决方案是在回调函数的帮助下转换每个值:
$ids = array_map( function($value) { return (int)$value; }, $ids )
其他回答
在Mark的解决方案中,如果您试图解析“test”之类的字符串,则将返回数组([0]=> int 0)。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
使用这个代码和一个闭包(在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)
}
另一种更短的方法是:
$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
其性能与方法3相同。
我很惊讶没有人提出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
这几乎比explosion (), array_map()和intval()快3倍:
$integerIDs = json_decode('[' . $string . ']', true);