将逗号分隔的字符串转换为整数数组?

313
以下代码:
$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而不是string。有没有更好的方法来做到这一点,而不是用foreach循环遍历数组并将每个string转换为int


1
对于寻找适用于多维数据的解决方案的研究人员,请参阅此类似问题:https://stackoverflow.com/questions/27147105/php-convert-string-in-array-to-int - mickmackusa
18个回答

3

保持简单...

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

你为什么要寻找其他方法呢?循环可以轻松完成任务。如果你关心性能,可以使用 json_decode()。有人已经发布了如何使用它的文章,所以我在这里不再赘述。

注意:当使用 == 运算符而不是 === 时,如果字符串值形成一个有效的数字(例如整数或双精度浮点数),它们会自动转换为数字,而不需要引号。例如:

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

因此,使用 == 可以解决你的问题,且效率较高,但如果在比较中使用 ===,则会出现错误。

3

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

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

这是与OP问题的偏离。这个答案可能更适合其他地方——需要递归的地方。而且在需要递归的情况下,PHP有一个本地的array函数,可以通过walk递归地遍历叶节点。 - mickmackusa
这是与原问题有偏差的回答 -- 技术上来说,问题标题或正文中都没有说明不会出现多维数组,因此任何看到这个问题的人都可能在寻找一个多维解决方案。 - Skeets
当然,你可以使用 array_walk_recursive……它是一个“更简短”的解决方案。忘记了那个,谢谢。(添加到答案) - Skeets
[mcve] 100%表示输入数据是逗号分隔的字符串,该字符串被拆分为索引化的一维数组。您是唯一一个将此问题扭曲成递归任务的人。我之前听过这种借口,即一些研究人员可能正在寻找“这个不同的答案”。对此,我要说:“太好了,我们肯定想分享可靠的技术,但要遵循‘mise en place’(法语,意为‘放置’)。帮助研究人员的最佳方法是将特定的技术放在预期的位置。” - mickmackusa
只需要不到60秒的谷歌搜索,我认为我找到了另一个更适合你答案的页面。https://stackoverflow.com/questions/27147105/php-convert-string-in-array-to-int 也许还有更多地方可以使用你的递归答案,但是对于这个明确定义的任务来说,递归是过度的。...以及相反的情况:https://stackoverflow.com/q/31599144/2943403 - mickmackusa
显示剩余4条评论

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

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

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

1
这个问题之前已经在这里发布过了,而且那个回答并不是最优解。请参考 https://dev59.com/j2kw5IYBdhLWcg3w2-XH#37118395。 - Dharman
1
此外,请勿发布仅包含代码的答案。对其进行解释将非常有帮助。否则,您的答案可能会被删除。 - 10 Rep
@10Rep。好的,我会记住的。 - Al-Amin

0

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

0

输入 => '["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)
}

谢谢


它解决了问题,但为什么有人要使用它呢?始终要尝试找到最优化的解决方案。 - Ravi Hirani

0
我对一些读者的问题有一个解决方案,我对上面的Mark Baker先生的解决方案进行了一些修改。
对于在Laravel PHP中遇到数组问题的用户,这是一个小调整。
$originalArray = $data->pluck('column')->toArray(); 
$convertedString = implode(', ', $originalArray); 
$data = array_map('intval', explode(',', $convertedString ));
    
var_dump($data);

-2

另一种技术是在将字符串拆分后,对输入的值进行类型提示(强制转换)为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)
}

我不是那个点踩的人 -- 但是所有这些解决方案都会在严格模式下失败,所以这可能是原因。这不是默认的PHP设置,但它非常流行。使用intval()将是更好的解决方案,而且已经被接受作为答案,所以这个答案并没有增加任何价值。 - Skeets
这个答案确实有价值,因为它是一个独特且可行的解决方案,正如我的演示链接所证明的。研究人员在确定自己项目中要使用什么技术时,可能会考虑这些技术。我并不声称这个答案比页面上任何其他答案更好或更差。我只是提供了更多可行的解决方案供大家选择。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接