找到数组中最长的匹配字符串

时间:2014-05-08 22:19:22

标签: php arrays snmp string-matching

我有一系列按层次排列的标识符(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条目。

基本上我只想从字符串的开头返回最长的匹配。

提前致谢!

2 个答案:

答案 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)

  1. 按对象ID中的组件数量从高到低对数组进行排序。
  2. 遍历数组,测试数组中的对象ID是否是输入对象ID的前缀。
  3. 当你找到这样的匹配时,就要摆脱循环。
  4. 如果您首先将所有对象ID转换为数组,则所有这些步骤可能都是最简单的:

    $objid_arr = explode('.', $objid);