以下代码:
$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?
当前回答
如果你有这样的数组:
$runners = ["1","2","3","4"];
如果你想把它们转换成整数并保持在数组中,下面应该做的工作:
$newArray = array_map( create_function('$value', 'return (int)$value;'),
$runners);
其他回答
如果您有一个多维数组,前面提到的解决方案都不起作用。以下是我的解决方案:
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);
});
我很惊讶没有人提出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
在Mark的解决方案中,如果您试图解析“test”之类的字符串,则将返回数组([0]=> int 0)。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
我的解决方案是在回调函数的帮助下转换每个值:
$ids = array_map( function($value) { return (int)$value; }, $ids )
另一种技术是在分解字符串后将传入值类型提示(强制)为int类型。
请注意,除非您将php设置为使用严格类型,否则这些技术将像我的演示链接中演示的那样工作。
以下技术不应用于清除非数字字符串;它假定所有的值都是数值。
如果将浮点值传递到这些技术中,它们将被截断/降为整数。
代码:(演示)
$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)
}