在数组中搜索PHP数组

5
$keywords = array('red', 'blue', 'yellow', 'green', 'orange', 'white');

$strings = array(
'She had a pink dress',
'I have a white chocolate',
'I have a green balloon',
'I have a chocolate shirt',
'He had a new yellow book',
'We have many blue boxes',
'I have a magenta tie');

实际上,strings数组非常庞大(50k+条目)。

运行搜索并提取匹配的字符串的最佳方法是什么?


4
如果数据来自数据库,应该在那里进行筛选。否则,可以使用array_filter()函数。 - jeroen
@Shafizadeh,方向错了,需要检查每个字符串中是否存在任何关键字。 - Bengali
在每个字符串中,您的意思是什么?否则,您的小例子已经没有结果了。 - GolezTrol
如果一个字符串包含了keywords数组中的任何一个单词,那么条件就成立。 - Bengali
1
@jeroen 我正在处理 array_filter。 :) - Bengali
2个回答

4
最好的方法是使用array_filter()函数。
$filtered_array = array_filter($strings,'filter');

function filter($a)
{
    $keywords = array('red', 'blue', 'yellow', 'green', 'orange', 'white');

    foreach ($keywords as $k)
    {
        if (stripos($a,$k) !== FALSE)
        {
            return TRUE;
        }
    }

    return FALSE;
}

不知道你实际上可以将数组传递给 stripos - adeneo
如果这个或任何答案解决了您的问题,请考虑通过点击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己赢得了一些声誉。没有义务这样做。 - worldofjr
1
而且你不能,它会抛出“stripos():needle不是一个字符串或整数”的错误。 - adeneo
1
@adeneo 通过循环避免了这个问题。虽然不是最优雅的解决方案,但它能够工作。 - worldofjr
@Bengali 你可能没有使用PHP5.5以上的版本。很容易解决,将该函数移出到其他地方进行定义,并在array_filter()中引用它即可。 - worldofjr
1
出于性能考虑,我建议在过滤函数之外定义 $keywords 变量,并在 use 语句中引用它。 - flec

4

使用array_filter函数对$strings数组进行过滤。
将字符串分割成一个数组,然后清除每个单词的空格,并使用array_intersect函数检查这个数组是否包含任何$keywords关键词。

$result = array_filter($strings, function($val) use ($keywords) {
    return array_intersect( array_map('trim', explode(' ', $val)) , $keywords);
});

1
我宁愿在你的lambda函数中使用use语句,而不是全局关键字。 - flec
@flec - 我真的不喜欢use,但由于关键字可能不会更改,所以这里不应该有任何问题,我同意并编辑了。 - adeneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接