我有一个名为'words'的数组,存储了很多单词。
例如:
我有'systematic', 'سلام','gear','synthesis','mysterious', etc.
注意:我们也有 utf8 字样。
如何有效地查询哪些单词包含字母's','m','e'
(所有单词)?
输出结果为:
systematic,mysterious
我不知道如何在PHP中做这样的事情。它应该是高效的,因为我们的服务器会受到影响。
答案 0 :(得分:3)
使用正则表达式将每个字符串拆分为一个字符数组,并使用array_intersect()
查找搜索数组中的所有字符是否存在于拆分数组中:
header('Content-Type: text/plain; charset=utf8');
$words = array('systematic', 'سلام','gear','synthesis','mysterious');
$search = array('s','m','e');
foreach ($words as $word) {
$char_array = utf8_str_split($word);
$contains = array_intersect($search, $char_array) == $search;
echo sprintf('%s : %s', $word, (($contains) ? 'True' : 'False'). PHP_EOL);
}
function utf8_str_split($str) {
return preg_split('/(?!^)(?=.)/u', $str);
}
输出:
systematic : True
سلام : False
gear : False
synthesis : False
mysterious : True
更新或者,您可以将array_filter()
与preg_match()
一起使用:
$array = array_filter($words, function($item) {
return preg_match('~(?=[^s]*s)(?=[^m]*m)(?=[^e]*e)~u', $item);
});
输出:
Array
(
[0] => systematic
[4] => mysterious
)
答案 1 :(得分:2)
这对我有用:
$words = array('systematic', 'سلام','gear','synthesis','mysterious');
$letters=array('s','m', 'e');
foreach ($words as $w) {
//print "lets check word $w<br>";
$n=0;
foreach ($letters as $l) {
if (strpos($w, $l)!==false) $n++;
}
if ($n>=3) print "$w<br>";
}
返回
systematic
mysterious
foreach
:一个用于单词,另一个用于匹配的字母。3
。答案 2 :(得分:1)
这样的事情:
$words = array('systematic', 'سلام','gear','synthesis','mysterious');
$result=array();
foreach($words as $word){
if(strpos($word, 's') !== false &&
strpos($word, 'm') !== false &&
strpos($word, 'e') !== false){
$result[] = $word;
}
}
echo implode(',',$result); // will output 'systematic,mysterious'
答案 3 :(得分:0)
你的问题很广泛。 我从你的问题中理解的是,这些单词都保存在数据库表中,所以你可以在使用SQL之类的函数之前过滤单词,然后使用类似函数的SQL。
如果你想搜索一个单词数组中的字母,你可以使用foreach遍历数组,每个数组值应该传递给strpos函数。 http://www.php.net/function.strpos
答案 4 :(得分:0)