我有一系列按层次排列的标识符(SNMP sysObjectIDs),我想匹配以找到最接近的匹配项。
例如,如果我的数组包含:
.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
我希望它能返回alliedwareplus条目。
如果我搜索
.1.3.6.1.4.1.207.1.4
它应该返回alliedware条目。
基本上我只想从字符串的开头返回最长的匹配。
提前致谢!
答案 0 :(得分:2)
这对我有用,并根据您的描述返回正确的测试结果。
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 :(得分:0)
如果您首先将所有对象ID转换为数组,则所有这些步骤可能都是最简单的:
$objid_arr = explode('.', $objid);