以下代码:

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


当前回答

Input => '["3","6","16","120"]'

类型转换我使用=> (int)$s;

function Str_Int_Arr($data){
    $h=[];
    $arr=substr($data,1,-1);
    //$exp=str_replace( ",","", $arr);
    $exp=str_replace( "\"","", $arr);
    $s=''; 
    $m=0;
    foreach (str_split($exp) as $k){
        if('0'<= $k && '9'>$k || $k =","){
            if('0' <= $k && '9' > $k){
                $s.=$k;
                $h[$m]=(int)$s;
            }else{
                $s="";
                $m+=1;
            } 
        } 
    } 
    return $h;
}
var_dump(Str_Int_Arr('["3","6","16","120"]'));

输出:

array(4) {
  [0]=>
  int(3)
  [1]=>
  int(6)
  [2]=>
  int(16)
  [3]=>
  int(120)
}

谢谢

其他回答

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

保持简单……

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

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

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

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

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

<?php
    
$string = "1,2,3";
$ids = explode(',', $string );

array_walk( $ids, function ( &$id )
{
    $id = (int) $id;
});
var_dump( $ids );

如果你有这样的数组:

$runners = ["1","2","3","4"];

如果你想把它们转换成整数并保持在数组中,下面应该做的工作:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);

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