我有一个表单,可以将一个单词与多个单词进行比较,并输出一个编辑分数列表。我怎样才能得到这些分数,以便它们按顺序列出,最小的编辑分数第一:
$string5 = $_POST["singleword"];
$string6 = $_POST["manywords"];
$array6 = explode(', ',$string6);
foreach ($array6 as $derp)
{
echo $string5, "/", $derp, ": ", levenshtein($string5, $derp), "<br>";
}
当前列表输出将是这样的:
apple/mango: 5
apple/peach: 5
apple/toothpaste: 8
apple/apes: 3
我希望它是这样的:
apple/apes: 3
apple/mango: 5
apple/peach: 5
apple/toothpaste: 8
$string5 = $_POST["singleword"];
$string6 = $_POST["manywords"];
$words = array_flip(array_map('trim', explode(',', $string6)));
foreach ($words as $key => $value)
{
$words[$key] = levenshtein($string5, $key);
}
asort($words);
foreach ($words as $key => $value)
{
echo sprintf('%s / %s: %s<br />', $string5, $key, $value);
}
我认为我建议填充一个数组数组,然后对其进行排序。如果所有子数组的大小相同,则第一个元素将被排序,第二个元素将用于打破任何联系。这将有效地创建按 levenshtein ASC 排序的有效负载,然后对 ASC 进行值排序。该脚本的优点之一是修改原始数组而不是填充新数组。此外,由于没有进行关键比较,因此不需要翻转。
代码:(演示)
$needle = 'apple';
$haystack = explode(', ', 'mango, peach, toothpaste, apes');
foreach ($haystack as &$v) {
$v = [levenshtein($needle, $v), $v];
}
sort($haystack);
foreach ($haystack as [$lev, $h]) {
echo "$needle/$h: $lev\n";
}