首页 > 解决方案 > 如何检查多个数字是否在逗号分隔的字符串中?

问题描述

我有这样的代码:

<?php  
$kecuali = "6,8,9";
for ($x = 0; $x < 15; $x++) {
  if ($x == $kecuali) {
    continue;
  }
  echo "The number is: $x <br>";
}
?>

结果是这样的

The number is: 0
The number is: 1
The number is: 2
The number is: 3
The number is: 4
The number is: 5
The number is: 7
The number is: 8
The number is: 9
The number is: 10
The number is: 11
The number is: 12
The number is: 13
The number is: 14

为什么数字 8 和 9 仍然在结果中,与数字 6 不同?我该如何解决这个问题,以便所有 3 个数字都不会出现在结果中?

标签: phparraysstringfor-loop

解决方案


==应该避免; 它试图在运行等价测试之前强制类型。所以"6fjsdkjfds" == 6恰好是真的,因为在"6"比较之前前导被转换为一个数字:(int)"6fjsdkjfds" => 6

始终使用===

现在,此更改进一步破坏了您的代码,并且似乎朝着错误的方向迈出了一步。但这是因为使用您的一组数字作为数组并执行查找in_array(或者array_key_exists如果您希望 O(1) 查找时间使用键而不是值...)是测试成员资格的正确方法,而不是扫描字符串或使用=====

相反,请尝试:

<?php

$skip = [6, 8, 9];

for ($i = 0; $i < 15; $i++) {
    if (in_array($i, $skip)) {
        continue;
    }

    echo "The number is: $i<br>";
}

?>

如果$skip(或$kecuali)不是您可以控制的数据,您可能需要将其解析为一个数组:

$skip = array_map("intval", explode(",", $kecuali));

在上面的代码之前。

如果您有大型数组,请考虑将复杂性提高到O(n+m)而不是O(n*m)

<?php

$skip = [6, 8, 9];
$skip = array_flip($skip);

for ($i = 0; $i < 15; $i++) {
    if (array_key_exists($i, $skip)) {
        continue;
    }

    echo "The number is: $i<br>";
}

?>

推荐阅读