字符串比较和更改数组的顺序

时间:2013-11-27 08:02:31

标签: php regex arrays

尝试为我有数组的用户创建搜索:

原始数组:

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函数(显示所有匹配项),并且可能是一个正则表达式,使其可以使用单个字母。

非常感谢任何建议!

1 个答案:

答案 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来获得排名高于另一个的排名。