PHP stripos 未返回所有位置

PHP stripos not returning all positions

我正在 returning stripos 函数匹配的所有数组

$requestedservice = request('service');
$result_array = array_filter($allservicesname, function($item) use ($requestedservice) {
return (stripos($item, $requestedservice) !== false);
        });

这只适用于第一次出现,例如-如果干草堆是Walk dance and rock,如果针是Walk,它会返回Walk dance and rock,但如果针是Walk rock 它没有 return Walk dance and rock。为什么会这样?

有没有办法找到所有出现的地方,使大海捞针Walk dance and rock与针Walk rock匹配?

而且如果针是 Walk run 它不应该匹配 Walk dance and rock,这是一种正常的用例

正如其他人所提到的,stripos only returns the first occurrence. After you turn the string into an array with explode, you can use a foreach loop with in_array 来完成您正在寻找的东西。

这是行动:

$all_services = explode(" ", "walk dance and rock");
$requested_services = explode(" ", "walk rock");
$result_array = array();

foreach ($all_services as $service) {
    if (in_array($service, $requested_services)) {
        $result_array[] = $service;
    }
}

您似乎可以通过不区分大小写的关键字检查循环实现所需的过滤。

代码:(Demo)

$allservicesname=['dance','Walk rock','Walk dance and rock','Walk'];  // array of haystacks

$requestedservice='walk rock';  // string of needles

$result_array=array_filter($allservicesname,function($string)use($requestedservice){
    foreach(explode(' ',$requestedservice) as $keyword){
        if(stripos($string,$keyword)===false){
            return false;
        }
    }
    return true;
});

var_export($result_array);

输出:

array (
  1 => 'Walk rock',
  2 => 'Walk dance and rock',
)

注意原始键保留在输出数组中。另外,我应该提到关键字可以以任何顺序出现并保持准确性。


或者,如果您不被正则表达式的想法吓跑,preg_grep() 可以简洁地执行此任务。该函数设计用于在每个元素上使用正则表达式过滤数组。

代码:(Demo) (Regex Pattern Demo)

$allservicesname=['Walk dance and rock walk','dance','walk','rock and walk','sidewalk and rockwall'];  // array of haystacks

$requestedservice='walk rock';  // string of needles
$pattern='/(?=.*\Q'.str_replace(' ','\E)(?=.*\Q',$requestedservice).'\E)/i';  // with literal substring matching, no wordboundaries
//$pattern='/(?=.*\b\Q'.str_replace(' ','\E\b)(?=.*\b\Q',$requestedservice).'\E\b)/i';  // with wordboundaries  
echo $pattern,"\n";

$result_array=preg_grep($pattern,$allservicesname);

var_export($result_array);

输出:

/(?=.*\Qwalk\E)(?=.*\Qrock\E)/i
array (
  0 => 'Walk dance and rock walk',
  3 => 'rock and walk',
  4 => 'sidewalk and rockwall',
)

如果您不希望元素 [4] 符合条件,则必须使用单词边界 - 请改用第二个(注释掉的)模式声明。

\Q..\E 确保正则表达式中没有特殊含义的字符不会干扰执行。其中的子字符串被解释为 "literally".