【问题标题】:How to output an array starting from the value with the highest character match count in php如何从php中字符匹配计数最高的值开始输出数组
【发布时间】:2026-01-21 16:30:01
【问题描述】:

我一直在尝试将字符串与数组中的值进行匹配,并从具有最高字符匹配计数的字符串开始输出数组字符串。例如:

$array = array(
'mike'=>'book21',
'ben'=>'buzz',
'jack'=>'airdrone',
'july'=>'march',
'fred'=>'blend45'
 );
$string = 'blenmaio2';

如您所见,'blend45'的匹配字符数最高,共有4个匹配字符。我希望能够从前四个最高匹配数开始输出它们,这是我想要的输出示例:

  1. blend45
  2. book21
  3. 三月
  4. 嗡嗡声

【问题讨论】:

  • 你试过什么?有什么问题,计算匹配,排序......?
  • 为什么march 排在第三位而buzz排在第四位?
  • 我尝试了similar_text() 但无法让它与max() 函数一起使用。

标签: php arrays regex


【解决方案1】:

这是我第一次尝试帮助别人,所以希望这可以解决问题。我知道你可以稍微简化一下代码,但这就是我所拥有的。

<?php
$array = array(
'mike'=>'book21',
'ben'=>'buzz',
'jack'=>'airdrone',
'july'=>'march',
'fred'=>'blend45'
 );
$string = 'blenmaio2';
$sort_array=array(); //Empty array


foreach ($array as $key => $value){
$num = similar_text($value,$string); //Using similar text to compar the strings.
$sort_array[$value] = $num; //Adding the compared number value and sring value to array.
}
arsort($sort_array, SORT_REGULAR);//Sorting the array by the larges number.

print_r ($sort_array);

//creating another foreach statement to get the output you wanted.
$count = 0;
foreach($sort_array as $key => $value){
$count++;
echo $count.". ".$key."\n";
};
?>

结果:

Array
(
    [blend45] => 4
    [book21] => 3
    [airdrone] => 3
    [march] => 2
    [buzz] => 1
)
1. blend45
2. book21
3. airdrone
4. march
5. buzz

【讨论】:

    【解决方案2】:

    我认为levenshtein() 函数将是实现您的目标最合适的方法:

    $array = array(
        'mike'=>'book21',
        'ben'=>'buzz',
        'jack'=>'airdrone',
        'july'=>'march',
        'fred'=>'blend45'
    );
    
    $string = 'blenmaio2';
    
    uasort($array, function($a, $b) use ($string) {
        $aDistance = levenshtein($string, $a);
        $bDistance = levenshtein($string, $b);
    
        return ($aDistance < $bDistance) ? -1 : 1;
    });
    
    print_r($array);
    
    // Output:
    // Array
    // (
    //     [fred] => blend45
    //     [july] => march
    //     [mike] => book21
    //     [ben] => buzz
    //     [jack] => airdrone
    // )
    

    http://php.net/levenshtein

    更新使用uasort()而不是usort()来保留数组键。

    我刚刚注意到我的答案比较了相似度,但不符合最高字符数匹配,很抱歉:)

    【讨论】:

    • 使用levenshtein 很聪明!
    • 我刚刚用正确的实现更新了我的答案,因为我首先没有使用$string (facepalm)。
    【解决方案3】:

    这是我的答案。这有点不同,因为我正在使用 levenshtein 函数来查找两个单词之间的最近点。 我正在使用 uasort 以您喜欢的方式重新排序数组。 当然你可以用你的函数替换最近的算法。

    <?php
    $array = array(
    'mike'=>'book21',
    'ben'=>'buzz',
    'jack'=>'airdrone',
    'july'=>'march',
    'fred'=>'blend45'
     );
    $string = 'blenmaio2';
    
    function cmp($a,$b){
        global $string;
        $aa=levenshtein($a, $string);
        $bb=levenshtein($b, $string);
        if($aa>$bb)
            return 1;
        elseif($bb>$aa)
            return -1;
        else return 0;
    }
    
    uasort($array,cmp);
    
    ?>
    
    <pre><?= print_r($array); ?></pre>
    

    【讨论】: