以下代码:

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


当前回答

另一种更短的方法是:

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

其性能与方法3相同。

其他回答

保持简单……

$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);

你为什么要另辟蹊径?循环毫无痛苦地完成了这项工作。如果您关心的是性能,那么可以使用json_decode()。人们已经发布了如何使用它,所以我在这里不包括它。

注意:当使用==操作符而不是===时,如果字符串值构成了一个没有引号的有效数字,则会自动转换为数字(例如整数或双精度)。例如:

$str = '1';
($str == 1) // true but
($str === 1) //false

因此,==可以解决你的问题,是有效的,但如果你在比较中使用===就会崩溃。

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

$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
$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)
}

PHP 7.4风格:

$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));

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