我有一个函数,它接受一个字符串(干草堆)和一个字符串数组(针),如果至少有一个针是干草堆的子字符串,则返回
true
。编写它并没有花费太多时间或精力,但我想知道是否有 PHP 函数已经做到了这一点。
function strstr_array_needle($haystack, $arrayNeedles){
foreach($arrayNeedles as $needle){
if(strstr($haystack, $needle)) return true;
}
return false;
}
只是一个建议...
function array_strpos($haystack, $needles)
{
foreach($needles as $needle)
if(strpos($haystack, $needle) !== false) return true;
return false;
}
我认为最接近的函数是 array_walk_recursive(),但这需要回调。因此,使用它可能会比您已有的更复杂。
没有单个函数的行为类似于
strstr_array_needle
(该名称具有误导性;我希望它返回 $haystack
的子字符串)。还有其他函数可以用来代替循环,但它们没有好处并且需要更多时间。例如:
# iterates over entire array, though stops checking once a match is found
array_reduce($needles,
function($found, $needle) use ($haystack) {
return $found || (strpos($haystack, $needle) !== false);
},
false);
# iterates over entire array and checks each needle, even if one is already found
(bool)array_filter($needles,
function($needle) use ($haystack) {
return strpos($haystack, $needle) !== false;
});
这是一个经过测试且有效的函数:
<?php
function strpos_array($haystack, $needles, $offset = 0) {
if (is_array($needles)) {
foreach ($needles as $needle) {
$pos = strpos_array($haystack, $needle);
if ($pos !== false) {
return $pos;
}
}
return false;
} else {
return strpos($haystack, $needles, $offset);
}
}
无论您需要返回布尔结果还是第一个遇到的匹配项,请使用可中断循环来消除无用的循环。如果您使用的是过时/不受支持的 PHP 版本,请将
str_contains()
替换为 strpos() !== false
检查。
代码:(演示)
function findANeedle(string $haystack, array $needles) {
foreach ($needles as $needle) {
if (str_contains($haystack, $needle)) {
return $needle;
}
}
return null;
}
function hasANeedle(string $haystack, array $needles): bool {
foreach ($needles as $needle) {
if (str_contains($haystack, $needle)) {
return true;
}
}
return false;
}
$haystack = 'food fighters';
$needles = ['bar', 'foo'];
var_export(findANeedle($haystack, $needles));
echo "\n--\n";
var_export(hasANeedle($haystack, $needles));
输出:
'foo'
--
true
我不太确定你想做什么,但我认为
in_array()
可以帮助你做你正在寻找的事情。
$needleArray = array(1, 2, 3); // the values we want to get from
$outputArray = array( ... ); // the values to search for
foreach ($outputArray as $value) {
if (in_array($value, $needleArray)) {
// do what you want to do...the $value exists in $needleArray
}
}
如果您只是想确定大海捞针中存在哪些针,我建议使用
array_intersect
函数。
来自 PHP.net 网站的文档
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
?>
The above example will output:
Array
(
[a] => green
[0] => red
)
基本上,这将生成一个数组,其中显示两个数组中出现的所有值。在您的情况下,如果找到任何针头,您的代码将返回 true。下面的代码将使用
array_intersect
函数来完成此操作,尽管这是否比 Charles 的答案更简单还有待商榷。
if(sizeof(array_intersect($hackstack, $arrayNeedles)) > 0)
return true;
else
return false;
再次,我不确定你的代码到底想做什么,除了如果存在针则返回 true 。如果您可以提供一些有关您想要实现的目标的背景信息,可能会有更好的方法。
希望这有帮助。