以下代码:

$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?


当前回答

我很惊讶没有人提出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

其他回答

另一种更短的方法是:

$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;

其性能与方法3相同。

在Mark的解决方案中,如果您试图解析“test”之类的字符串,则将返回数组([0]=> int 0)。

$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );

另一种技术是在分解字符串后将传入值类型提示(强制)为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)
}

我很惊讶没有人提出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);