php - 使用 PHP 从数组和给定模式中获取最接近的序列结果

标签 php arrays compare sequence string-comparison

我正在尝试使用既定的顺序从字母中获取年份和月份。我知道该序列基于以下字母:

$letters = array('B','C','D','F','G','H','J','K','L','M','N','P','R','S','T','V','W','X','Y','Z');

它从 0000BBB 开始,当它达到 9999 时,它会变成 BBC、BBD 等。所以我不需要这种情况下的数字,只需要字母,因为我有每年和每月最后注册序列的列表,如下所示:

$plates = array(
            array('2018','KHF','KHX','KJV','KKN','KLM','KML','KNK','KPD','KPR','KPT','----','----'),
            array('2017','JWN','JXF','JYB','JYT','JZP','KBM','KCH','KCV','KDK','KFB','KFV','KGN'),
            array('2016','JLN','JMF','JMY','JNR','JPK','JRG','JRZ','JSL','JTB','JTR','JVH','JVZ'),
            array('2015','JCK','JCY','JDR','JFG','JFW','JGP','JHJ','JHT','JJH','JJW','JKK','JKZ'),
            array('2014','HVN','HVZ','HWM','HXB','HXN','HYD','HTY','HZB','HZL','HZZ','JBL','JBY'),
            array('2013','HNT','HPC','HPN','HPY','HRK','HRX','HSK','HSR','HSZ','HTK','HTV','HVF'),
            array('2012','HJC','HJM','HKB','HKL','HKX','HLK','HLW','HMD','HML','HMT','HNC','HNK'),
            array('2011','HBP','HCB','HCR','HDC','HDR','HFF','HFT','HGC','HGM','HGX','HHH','HHT'),
            array('2010','GTC','GTS','GVM','GWC','GWV','GXP','GYD','GYM','GYX','GZJ','GZT','HBG'),
            array('2009','GKS','GLC','GLP','GMC','GMN','GNF','GNY','GPJ','GPW','GRM','GSC','GSR'),
            array('2008','FZR','GBN','GCK','GDH','GFC','GFY','GGV','GHG','GHT','GJJ','GJV','GKH'),
            array('2007','FKY','FLV','FNB','FNZ','FRC','FSJ','FTP','FVJ','FWC','FXB','FXY','FYY'),
            array('2006','DVW','DWT','DXZ','DYY','FBC','FCJ','FDP','FFK','FGF','FHD','FJD','FKC'),
            array('2005','DFZ','DGX','DHZ','DKB','DLD','DMJ','DNP','DPK','DRG','DSC','DTB','DVB'),
            array('2004','CRV','CSS','CTT','CVR','CWR','CXT','CYY','CZP','DBJ','DCH','DDG','DFF'),
            array('2003','CDV','CFM','CGJ','CHF','CJC','CKB','CLD','CLV','CMM','CNK','CPF','CRC'),
            array('2002','BSL','BTF','BTZ','BVW','BWT','BXP','BYP','BZF','BZV','CBP','CCH','CDC'),
            array('2001','BFJ','BGF','BHG','BJC','BKB','BLC','BMF','BMW','BNL','BPG','BRB','BRT'),
            array('2000','---','---','---','---','---','---','---','---','BBJ','BCD','BCY','BDR')
        );

这意味着数组索引 0 是年份,1 到 12 是月份。我试图找到匹配项,但后来意识到我无法搜索确切的值,需要根据字母查找最接近的值。

如果有人能够指导我正确的方向,那么最好的方法是什么。

这是迄今为止的一个测试,但这只会返回一个完全匹配的结果,我必须搜索任何可能的字母,例如 KHW 作为示例,这些字母必须与 最接近的值匹配>KHX

foreach ($plates as $key => $val) {                        
            $search = array_search('KHX', $plates[$key]);            
            if($search){
                echo $search."\n";
                echo $plates[$key][0];
                break;
            }
        }        

最佳答案

您可以通过二分搜索以 O(log n) 的方式解决该问题。但在更直接的解决方案中,您可以使用 O(n) 来解决它。 您可以使用以下算法计算每个单词之间的差异。 ‍‍

<?php

function strToInt($str)
{
    $result = 0;
    for ($i = 0; $i < strlen($str); $i++) {
        $result = $result * 100 + ord($str[$i]);
    }

    return $result;
}

function find($searchStr)
{
    $plates = [
        ['2018','KHF','KHX','KJV','KKN','KLM','KML','KNK','KPD','KPR','KPT','----','----'],
        ['2017','JWN','JXF','JYB','JYT','JZP','KBM','KCH','KCV','KDK','KFB','KFV','KGN'],
        ['2016','JLN','JMF','JMY','JNR','JPK','JRG','JRZ','JSL','JTB','JTR','JVH','JVZ'],
        ['2015','JCK','JCY','JDR','JFG','JFW','JGP','JHJ','JHT','JJH','JJW','JKK','JKZ'],
        ['2014','HVN','HVZ','HWM','HXB','HXN','HYD','HTY','HZB','HZL','HZZ','JBL','JBY'],
        ['2013','HNT','HPC','HPN','HPY','HRK','HRX','HSK','HSR','HSZ','HTK','HTV','HVF'],
        ['2012','HJC','HJM','HKB','HKL','HKX','HLK','HLW','HMD','HML','HMT','HNC','HNK'],
        ['2011','HBP','HCB','HCR','HDC','HDR','HFF','HFT','HGC','HGM','HGX','HHH','HHT'],
        ['2010','GTC','GTS','GVM','GWC','GWV','GXP','GYD','GYM','GYX','GZJ','GZT','HBG'],
        ['2009','GKS','GLC','GLP','GMC','GMN','GNF','GNY','GPJ','GPW','GRM','GSC','GSR'],
        ['2008','FZR','GBN','GCK','GDH','GFC','GFY','GGV','GHG','GHT','GJJ','GJV','GKH'],
        ['2007','FKY','FLV','FNB','FNZ','FRC','FSJ','FTP','FVJ','FWC','FXB','FXY','FYY'],
        ['2006','DVW','DWT','DXZ','DYY','FBC','FCJ','FDP','FFK','FGF','FHD','FJD','FKC'],
        ['2005','DFZ','DGX','DHZ','DKB','DLD','DMJ','DNP','DPK','DRG','DSC','DTB','DVB'],
        ['2004','CRV','CSS','CTT','CVR','CWR','CXT','CYY','CZP','DBJ','DCH','DDG','DFF'],
        ['2003','CDV','CFM','CGJ','CHF','CJC','CKB','CLD','CLV','CMM','CNK','CPF','CRC'],
        ['2002','BSL','BTF','BTZ','BVW','BWT','BXP','BYP','BZF','BZV','CBP','CCH','CDC'],
        ['2001','BFJ','BGF','BHG','BJC','BKB','BLC','BMF','BMW','BNL','BPG','BRB','BRT'],
        ['2000','---','---','---','---','---','---','---','---','BBJ','BCD','BCY','BDR']
    ];

    $minYear = null;
    $minKey = null;
    $minDiff = strToInt('ZZZ');
    $searchInt = strToInt($searchStr);

    for ($i = 0; $i < count($plates); $i++) {
        for ($j = 1; $j < 13; $j++) {
            if(abs($searchInt - strToInt($plates[$i][$j])) < $minDiff) {
                $minDiff = abs($searchInt - strToInt($plates[$i][$j]));
                $minYear = $plates[$i][0];
                $minKey = $plates[$i][$j];
            }
        }
    }

    return [$minYear, $minKey];
}


print_r(find('KHW'));

关于php - 使用 PHP 从数组和给定模式中获取最接近的序列结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62026724/

相关文章:

php - imagick/php - 检查图片之间的差异和变化的判断

php - 进行数据库搜索并发送电子邮件

javascript - 从 JSON 对象中的数组获取数据

image - 错误图像::比较(jpg 文件)

javascript - 搜索和删除数组中重复项的算法

python - 两个 2d NumPy 数组中一行中所有元素之间的差异?

javascript - 为什么我的 crypto.createHmac() 会为相同的输入生成不同的 HMAC?

php - 在 jquery 和 php 中显示来自 dropmenu 的数据库的结果

php - 编辑 html 表中的特定列

arrays - 剧作家 - 检查定位器是否只有 1 个元素