以下代码:
$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?
当前回答
$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)
}
其他回答
在Mark的解决方案中,如果您试图解析“test”之类的字符串,则将返回数组([0]=> int 0)。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
如果您有一个多维数组,前面提到的解决方案都不起作用。以下是我的解决方案:
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]]
这适用于任何深度。
或者,你可以使用array_walk_recursive()来得到一个更简短的答案:
array_walk_recursive($array, function(&$value){
$value = intval($value);
});
PHP 7.4风格:
$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));
使用这个代码和一个闭包(在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相同。