到目前为止我所拥有的:
$searchQuery = "keyword1 keyword2";
$searchArray = explode(" ", $searchQuery);
$stringToCheck = "keyword1 keyword3 keyword2";
foreach ($searchArray as $searchKeyword) {
if (strpos($stringToCheck, $searchKeyword) !== false) :
//do something
endif;
}
endif;
我想要的是,只有在字符串中找到搜索查询中的所有值时才显示某些内容。对于我上面的当前代码,如果字符串包含关键字1和关键字2,它会"做一些事情"两次,每次匹配一次。如果字符串只包含关键字1而不包含关键字2,那么它也会显示为true,在这种情况下,它会显示一次内容。
解决方案
function str_contains_all($haystack, array $needles) {
foreach ($needles as $needle) {
if (strpos($haystack, $needle) === false) {
return false;
}
}
return true;
}
用法:
$haystack = 'foo, bar, baz';
$needles = array('foo', 'bar', 'baz');
if (str_contains_all($haystack, $needles)) {
echo "Success'n";
// ...
}
备注
由于您指定当"haystack"字符串包含所有子字符串"needs"时,仅希望执行操作,因此一旦发现不在haystack中的针,就可以安全地返回false
。
其他
根据我的经验,在PHP中使用if (...): /* ... */ endif;
是相当罕见的。我认为大多数开发人员更喜欢C风格的if (...) { /* ... */ }
语法。
适用于任何可能需要其他方式的人。我是在寻找解决方案时想到这个的。确保要测试的是两个阵列;
$var1 = explode(' ',"a string to be turned to an array");
$var2 = ["test","a","string","array"];
获取两个数组的计数(或长度);
$var1count = count($var1);
$var2count = count($var2);
//使用array_entersect()方法获取两个数组的交集
$intersect = array_intersect($var1,$var2);
//检查相交的计数(或长度)是否与测试变量(例如$var1)相同
if(count($intersect)===$var1count)//it has all the words
仅供参考:区分大小写。您可能希望将所有转换为小写或大写