当每个项目可能有多个关键字(或短语)时,我应该如何根据关键字从列表中选择项目


How should I select items from a list based on keyword when each item might have several keywords (or phrases)

我一开始就是这样,但决定如果我得到更多的项目,那就太长了。

$keyword=getKeyword();
switch (true)
  {
    case $keyword=='special product':
    $keyword_custom_items[]='SPECIAL';
    break;
    case ($keyword=='other special' || $keyword=='other specials' || $keyword=='more specials'):
    $keyword_custom_items[]='EXTRA-SPECIAL';
    break;
    default:
    break;
  }
// handle custom items if $keyword_custom_items is set.

除了需要复制复数单词外,这不允许近似匹配。解决这个问题的更好方法是什么?

您可以使用正则表达式匹配。见 http://php.net/manual/en/function.preg-match.php

或者,如果您只是切换几种$keyword,则可以:

switch ($keyword) {
    case "special product":
       $keyword_custom_items[]='SPECIAL';
       break;
    case "other special":
    case "other specials":
    case "more specials":
       $keyword_custom_items[]='EXTRA-SPECIAL';
       break;
    default:
       $keyword_custom_items[]='NONE';
}

使用 strpos 在字符串中搜索字符串。虽然它仍然会很长,但如果用户写"specials",它将帮助您的系统找到"特殊"。

if (strpos($keyword, 'special') !== false)
   {$keyword_custom_items[]='SPECIAL';}

我最终这样做了:

$keyword_to_item=array(
'blender bottles'=>'MIX-IT',
'shaker bottles'=>'MIX-IT',
'shaker cups'=>'MIX-IT',
'mixer bottles'=>'MIX-IT',
'protein mixer'=>'MIX-IT',
'protein shaker'=>'MIX-IT',
);
if(!function_exists(keyword_search)){ //THIS IS IN A LOOP, SO MAKE SURE WE DO NOT REDECLARE
function keyword_search($val)
  {
    global $promotional;
    $lc_keyword=strtolower($promotional);
    similar_text($lc_keyword,$val,$similarity);
    return $similarity > 70;
  }
}
$found=array_filter(array_keys($keyword_to_item),"keyword_search");
$found=array_values($found);
foreach((array)$keyword_to_item[$found[0]] as $item)
  {
    //DO STUFF
  }