【问题标题】:Find the longest matching string in an array查找数组中最长的匹配字符串
【发布时间】:2014-06-26 12:58:48
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 让我想起了二叉树。 :)
  • 我想到的解决方案真的很慢,只会影响性能。我会密切关注您收到的答复。

标签: php arrays snmp string-matching


【解决方案1】:
  1. 按对象 ID 中的组件数从高到低对数组进行排序。
  2. 遍历数组,检测数组中的对象ID是否为输入对象ID的前缀。
  3. 当您找到这样的匹配项时,请跳出循环。

如果您首先将所有对象 ID 转换为数组,那么所有这些步骤可能会最简单:

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

【讨论】:

    【解决方案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.3.6.1.4.1.207”和“.1.3.6.1.4.1.20”时会发生什么?这是 SNMP 中一个非常重要的区别,以确保您比较数字,而不是匹配字符串表示的前缀。我的 Php 还不够好,无法确定您是否在这里所做的。
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多