php - 如何检查多个数字是否在逗号分隔的字符串中?
问题描述
我有这样的代码:
<?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 个数字都不会出现在结果中?
解决方案
==
应该避免; 它试图在运行等价测试之前强制类型。所以"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>";
}
?>
推荐阅读
- hapijs - 处理 CRUD 测试的最佳方法?
- java - How to release a guava cache object
- c++ - 从 JSON 像 DSL 到 qml 的转换
- reactjs - 如何在使用 withformik 和 antd 组件时调用 OnChange 函数?
- python - 如何确定多行 python 命令的位置(警告)?
- javascript - “skip if condition”和“direct return”之间的性能差异是什么?
- sql - 根据管道和大写分隔符将文本拆分为多行 - Oracle PL/SQL 流水线函数
- c# - using() 与 C# 中的本地范围对象
- javascript - Google Firestore - 使用 JS 获取最新更新并显示在浏览器上
- opencv - 为grabCut缩小图像