有没有比使用strpos()循环更好的方法?
我不是在寻找部分匹配而不是in_array()类型方法。
示例针和干草堆以及期望的回报:
$needles[0] = 'naan bread';
$needles[1] = 'cheesestrings';
$needles[2] = 'risotto';
$needles[3] = 'cake';
$haystack[0] = 'bread';
$haystack[1] = 'wine';
$haystack[2] = 'soup';
$haystack[3] = 'cheese';
//desired output - but what's the best method of getting this array?
$matches[0] = 'bread';
$matches[1] = 'cheese';
即:
magic_function($ haystack,%$ needle%)!
答案 0 :(得分:3)
foreach($haystack as $pattern) {
if (preg_grep('/'.$pattern.'/', $needles)) {
$matches[] = $pattern;
}
}
答案 1 :(得分:2)
我认为你在问题中混淆了$haystack
和$needle
,因为 naan bread 不在大海捞针中,也不是 cheesestring 。您想要的输出表明您正在寻找 cheesestring 中的 cheese 。为此,以下内容可行:
function in_array_multi($haystack, $needles)
{
$matches = array();
$haystack = implode('|', $haystack);
foreach($needles as $needle) {
if(strpos($haystack, $needle) !== FALSE) {
$matches[] = $needle;
}
}
return $matches;
}
对于您给定的干草堆和针头,其执行速度是正则表达式解决方案的两倍。可能会改变不同数量的参数。
答案 2 :(得分:1)
我认为你必须自己动手。用户贡献的评论array_intersect()提供了许多替代实现(如this one)。您只需将==
匹配替换为strstr()
。
答案 3 :(得分:1)
$data[0] = 'naan bread';
$data[1] = 'cheesestrings';
$data[2] = 'risotto';
$data[3] = 'cake';
$search[0] = 'bread';
$search[1] = 'wine';
$search[2] = 'soup';
$search[3] = 'cheese';
preg_match_all(
'~' . implode('|', $search) . '~',
implode("\x00", $data),
$matches
);
print_r($matches[0]);
// [0] => bread
// [1] => cheese
如果您告诉我们有关真实问题的更多信息,您会得到更好的答案。