以下代码:

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


当前回答

如果您有一个多维数组,前面提到的解决方案都不起作用。以下是我的解决方案:

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);
});

其他回答

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)
}
$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)
}

这几乎比explosion (), array_map()和intval()快3倍:

$integerIDs = json_decode('[' . $string . ']', true);

另一种更短的方法是:

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

其性能与方法3相同。