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

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

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

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

提前谢谢

  • 按对象ID中组件的数量从高到低对数组进行排序
  • 循环遍历数组,测试数组中的对象ID是否是输入对象ID的前缀
  • 当你找到这样的匹配,打破循环
  • 如果首先将所有对象ID转换为数组,则所有这些步骤可能最简单:

    $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不够好,无法确定这是否是您在这里所做的。