在语音应用程序中,我必须找到国际电话号码前缀的最长匹配。我有一个 50K 行的费率表,存储在 CSV 文件中,该文件会定期更新为新费率(CSV 列标题包含前缀、国家/地区费率等)。该应用程序使用 REST API 来根据用户输入的电话向用户显示呼叫目的地的费用。不能使用简单的 KVS,因为有多个匹配项并且需要最长的前缀匹配项。API 受到很多打击,因此直接使用数据库太慢/太重(在此处使用 APC,但似乎没有太大区别)。我能想出的最佳算法如下所示,但在体面的机器上完成仍需要将近 1 秒。任何 PHP 算法大师有更好的方法吗?
function getRate($phoneNumber) {
if (!apc_fetch('ALL_RATES')){
$all_rates = array_map('str_getcsv', file('/var/billing/rates.csv'));
apc_store('ALL_RATES', $all_rates);
} else {
$all_rates = apc_fetch('ALL_RATES');
}
$noOfCountries = sizeof($all_rates);
$bestMatch = 0;
for ($n=1;$n<$noOfCountries;$n++) {
$country = $all_rates[$n];
$country_prefix = $country[0];
$match = stripos($phoneNumber, $country_prefix);
if ($match===0){
if (strlen($country_prefix) > $bestMatch) {
$bestMatch = strlen($country_prefix);
$matchedCountry = $n;
}
}
}
$prefix = $all_rates[$matchedCountry][0];
$country = $all_rates[$matchedCountry][1];
$rate = $all_rates[$matchedCountry][2];
return array($country,$prefix,$rate);
}
}