尝试为我有数组的用户创建搜索:
原始数组:
array(2) {
[1]=>
array(1) {
["string"]=>"One two three, Blue, Green, Yellow"
}
[2]=>
array(1) {
["string"]=>"One two four, Blue, Green, Yellow"
}
}
现在我怎样才能用输入字段中的单词做一个正则表达式,这可能是“一二蓝四”然后更改给定的数组顺序(在本例中为):
array(2) {
[1]=>
array(1) {
["string"]=>"One two four, Blue, Green, Yellow"
}
[2]=>
array(1) {
["string"]=>"One two three, Blue, Green, Yellow"
}
}
原因原始数组[2] 有更多匹配。如果用户写“one two blue f”
,我也希望订单改变我已经尝试过使用array_diff,但是我需要一些相反的array_diff函数(显示所有匹配项),并且可能是一个正则表达式,使其可以使用单个字母。
非常感谢任何建议!
答案 0 :(得分:1)
我会查询搜索字词,并使用stripos()
或substr_count()
对数组中的字符串检查每个单词。如果它出现的次数越少,那么出现次数越多的事件就越多。您可以使用usort()
。
你的分拣机看起来像这样:
class OccurrenceSorter {
private $searchTerm;
public function sort(array $arr, $searchTermStr) {
$this->searchTerm = preg_split('/\s+/', $searchTermStr);
usort($arr, array($this, 'doSort'));
return $arr;
}
private function doSort($a, $b) {
$aScore = $this->getScore($a['string']);
$bScore = $this->getScore($b['string']);
if($aScore == $bScore)
return 0;
return ($aScore < $bScore)?1:-1;
}
private function getScore($str) {
$score = 0;
$strLower = strtolower($str);
foreach($this->searchTerm as $st) {
// substr_count() or strpos() depending on the wished behavior
$score += substr_count($strLower, strtolower($st));
}
return $score;
}
}
$arr = array(
array('string' => 'One two three, Blue, Green, Yellow'),
array('string' => 'One two four, Blue, Green, Yellow')
);
$searchTerm = 'one two blue four';
$rs = new OccurrenceSorter();
$sortedArr = $rs->sort($arr, $searchTerm);
var_dump($sortedArr);
请注意,我在示例中使用了substr_count()
。所以字符串
two four, four, four, Blue, Blue, Green, Yellow
比以下字符串“更高”(尽管此字符串涵盖更多不同的搜索字词):
One two four, Blue, Green, Yellow
总共第一个字符串有6个匹配(两个,四个,四个,四个,蓝色,蓝色),第二个字符串有4个匹配(一个,两个,四个,蓝色)。如果这不是希望的行为,请使用strpos()
。如果substr_count()
strpos()
和a
相同,则可以使用b
来获得排名高于另一个的排名。