根据值与比较字符串的编辑距离对值数组进行排序

问题描述 投票:0回答:2

我有一个表单,可以将一个单词与多个单词进行比较,并输出一个编辑分数列表。我怎样才能得到这些分数,以便它们按顺序列出,最小的编辑分数第一:

$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
php arrays sorting levenshtein-distance
2个回答
2
投票
$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);
}

0
投票

我认为我建议填充一个数组数组,然后对其进行排序。如果所有子数组的大小相同,则第一个元素将被排序,第二个元素将用于打破任何联系。这将有效地创建按 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";
}
© www.soinside.com 2019 - 2024. All rights reserved.