2014-05-08 3 views
0

J'ai un tableau d'identifiants hiérarchiquement arrangés (SNMP sysObjectIDs), que je voudrais comparer afin de trouver la correspondance la plus proche.Trouver la plus longue chaîne correspondante dans un tableau

Par exemple, si mon tableau contient:

.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 

Je recherche pour

.1.3.6.1.4.1.207.1.14.69 

Je voudrais revenir à l'entrée de alliedwareplus.

Si je recherche

.1.3.6.1.4.1.207.1.4 

Il doit retourner l'entrée AlliedWare.

Fondamentalement, je veux juste retourner la plus longue correspondance à partir du début de la chaîne.

Merci d'avance!

+0

:) –

+0

Les solutions que j'ai trouvées de mon esprit seraient vraiment lentes et ne feraient que nuire aux performances. Je vais porter une attention particulière aux réponses que vous recevez. – Ozmah

Répondre

0
  1. Trier le tableau par le nombre de composants dans l'ID d'objet, de haut en bas.
  2. Parcourez la baie en testant si l'ID d'objet dans le tableau est un préfixe de l'ID d'objet en entrée.
  3. Lorsque vous trouvez un match comme celui-ci, sortez de la boucle.

Toutes ces étapes seront probablement plus facile si vous devez d'abord convertir tous les ID d'objet à un tableau:

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

Cela a fonctionné pour moi et renvoie les résultats des tests corrects en fonction de votre description. Me rappelle un arbre binaire.

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' 
+0

Qu'est-ce que cela ferait lorsque le préfixe correspondant ".1.3.6.1.4.1.207" vs ".1.3.6.1.4.1.20"? C'est une distinction très importante dans SNMP, pour s'assurer que vous comparez les nombres, plutôt que le préfixe correspondant aux représentations de chaîne. Mon Php n'est pas assez bon pour déterminer si c'est ce que vous avez fait ici. – Jolta

Questions connexes