2016-12-20 3 views
0

配列に最初に最も近い値を配列として並べ替えるとします。入力文字列に最も近いものをマッチングして配列をソートする方法は?

私がこれまで持っている:

$array = array("Year 6", "Year 4", "Eden camp trip", "Easter school", "Eden camp trip", "Year 6 Chester Zoo", "Year 6 Trip to Chester"); 

$search = strtolower("Year 6"); 

usort($array, function ($a, $b) use ($search) { 
    similar_text($search, $a, $aa); 
    similar_text($search, $b, $bb); 
    return $aa === $bb ? 0 : ($aa > $bb ? -1 : 1); 
}); 

echo "<pre>"; 
    print_r($array); 
echo "</pre>"; 

結果:

Array 
(
    [0] => Year 6 
    [1] => Year 4 
    [2] => Year 6 Chester Zoo 
    [3] => Year 6 Trip to Chester 
    [4] => Easter school 
    [5] => Eden camp trip 
    [6] => Eden camp trip 
) 

期待される結果:

Array 
(
    [0] => Year 6 
    [1] => Year 6 Chester Zoo 
    [2] => Year 6 Trip to Chester 
    [3] => Year 4 
    [4] => Easter school 
    [5] => Eden camp trip 
    [6] => Eden camp trip 
) 
+3

*最も近い一致のあなたの期待*が 'similar_text'、' levenshtein'、または 'soundex'のような組み込み関数で覆われていない限り、あなたは文字列の比較を実装する必要がありますあなた自身。 –

答えて

0

オーケー@AlexBlex advice..Iは以下行き、調査した服用私が探していたことをする方法。

$array = array("Year 6", "Year 4", "Eden camp trip", "Easter school", "Eden camp trip", "Year 6 Chester Zoo", "Year 6 Trip to Chester"); 

$search = strtolower("Year 6"); 

usort($array, function($a, $b) use ($search) { 

     $a = strtolower($a); 
     $b = strtolower($b); 

     if ($a == $search) return -1; 
     if ($b == $search) return 1; 

     $x = strpos($a, $search); 
     $y = strpos($b, $search); 

     if ($x !== false && $y === false) return -1; 
     if ($y !== false && $x === false) return 1; 
     if ($x !== false && $y !== false) { 

      if ($x != $y) return $x > $y ? 1 : -1; 

      $al = strlen($a); 
      $bl = strlen($b); 

      if ($al != $bl) return $al > $bl ? 1 : -1; 

      return 0; 
     } 

     $ac = levenshtein($search, $a); 
     $bc = levenshtein($search, $b); 

     if ($ac != $bc) return $ac > $bc ? 1 : -1; 

     return 0; 
}); 

    echo "<pre>"; 
     print_r($array); 
    echo "</pre>"; 

結果:

Array 
(
    [0] => Year 6 
    [1] => Year 6 Chester Zoo 
    [2] => Year 6 Trip to Chester 
    [3] => Year 4 
    [4] => Easter school 
    [5] => Eden camp trip 
    [6] => Eden camp trip 
) 
関連する問題