是否有一个本机的PHP函数来查看一个值数组是否在另一个数组中?

时间:2010-04-21 18:19:17

标签: php

有没有比使用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%)!

4 个答案:

答案 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

如果您告诉我们有关真实问题的更多信息,您会得到更好的答案。