Php 查找数组中最长的匹配字符串
我有一个分层排列的标识符数组(SNMP SysObjectId),我想对其进行匹配,以便找到最接近的匹配项 例如,如果我的数组包含:Php 查找数组中最长的匹配字符串,php,arrays,snmp,string-matching,Php,Arrays,Snmp,String Matching,我有一个分层排列的标识符数组(SNMP SysObjectId),我想对其进行匹配,以便找到最接近的匹配项 例如,如果我的数组包含: .1.3.6.1.4.1.207 = alliedware .1.3.6.1.4.1.207.1.14 = alliedwareplus .1.3.6.1.4.1.207.1.4.126 = allied-radlan .1.3.6.1.4.1.207.1.4.125 = allied-radlan 我在寻找 .1.3.6.1.4.1.20
.1.3.6.1.4.1.207 = alliedware
.1.3.6.1.4.1.207.1.14 = alliedwareplus
.1.3.6.1.4.1.207.1.4.126 = allied-radlan
.1.3.6.1.4.1.207.1.4.125 = allied-radlan
我在寻找
.1.3.6.1.4.1.207.1.14.69
.1.3.6.1.4.1.207.1.4
我希望它返回alliedwareplus条目
如果我搜索
.1.3.6.1.4.1.207.1.14.69
.1.3.6.1.4.1.207.1.4
它应该返回alliedware条目
基本上,我只想返回从字符串开头开始的最长匹配
提前谢谢
$objid_arr = explode('.', $objid);
这对我有效,并根据您的描述返回正确的测试结果
function find_match($data,$search) {
$keys = array_keys($data);
usort($keys,function($a,$b){
return strlen($b)-strlen($a);
});
foreach($keys as $key){
if (substr($search,0,strlen($key)) == $key)
return $data[$key];
}
}
$data = array(
'.1.3.6.1.4.1.207' => 'alliedware',
'.1.3.6.1.4.1.207.1.14' => 'alliedwareplus',
'.1.3.6.1.4.1.207.1.4.126' => 'allied-radlan',
'.1.3.6.1.4.1.207.1.4.125' => 'allied-radlan',
);
find_match($data,'.1.3.6.1.4.1.207.1.14.69'); // => 'alliedwareplus'
find_match($data,'.1.3.6.1.4.1.207.1.4'); // => 'alliedware'
让我想起了一棵二叉树。:)我脑子里想出来的解决方案会非常慢,只会影响性能。我将密切关注您收到的答案。当前缀匹配“.1.3.6.1.4.1.207”与“.1.3.6.1.4.1.20”时,这会产生什么影响?在SNMP中,一个非常重要的区别是确保比较数字,而不是前缀匹配字符串表示。我的Php不够好,无法确定这是否是您在这里所做的。