在单词列表中搜索一个字母?

时间:2013-12-17 09:50:00

标签: php arrays string

我有一个名为'words'的数组,存储了很多单词。

例如: 我有'systematic', 'سلام','gear','synthesis','mysterious', etc.

注意:我们也有 utf8 字样。 如何有效地查询哪些单词包含字母's','m','e'(所有单词)?

输出结果为:

systematic,mysterious

我不知道如何在PHP中做这样的事情。它应该是高效的,因为我们的服务器会受到影响。

5 个答案:

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

Demo.


更新或者,您可以将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
)

Demo.

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

为什么不使用PREG_GREP

$your_array = preg_grep("/[sme]/", $array);

print_r($your_array);

WORKING DEMO