在大海捞针中找到至少一根针,其中提供了一组针

问题描述 投票:0回答:7

我有一个函数,它接受一个字符串(干草堆)和一个字符串数组(针),如果至少有一个针是干草堆的子字符串,则返回

true
。编写它并没有花费太多时间或精力,但我想知道是否有 PHP 函数已经做到了这一点。

function strstr_array_needle($haystack, $arrayNeedles){
    foreach($arrayNeedles as $needle){
        if(strstr($haystack, $needle)) return true;
    }
    return false;    
}
php arrays string search
7个回答
9
投票

只是一个建议...

function array_strpos($haystack, $needles)
{
    foreach($needles as $needle)
        if(strpos($haystack, $needle) !== false) return true;
    return false;
}

1
投票

我认为最接近的函数是 array_walk_recursive(),但这需要回调。因此,使用它可能会比您已有的更复杂。


0
投票

没有单个函数的行为类似于

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

0
投票

这是一个经过测试且有效的函数:

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

0
投票

无论您需要返回布尔结果还是第一个遇到的匹配项,请使用可中断循环来消除无用的循环。如果您使用的是过时/不受支持的 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

-1
投票

我不太确定你想做什么,但我认为

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

-1
投票

如果您只是想确定大海捞针中存在哪些针,我建议使用

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 。如果您可以提供一些有关您想要实现的目标的背景信息,可能会有更好的方法。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.