[PHP] Recupérer nième champ d'une chaine

Fermé
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 - 18 avril 2008 à 10:14
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 - 18 avril 2008 à 15:07
Bonjour,
pour le sujet de mon stage je dois récupérer la fini d'une chaine.
j'avais fait :

$new_result = substr($result,11,strlen($result ));


il s'agit en fait d'une chaine de type :
17.4.3.1.1.0.31.91.233.220.142

ou je dois récupérer cette partie :

0.31.91.233.220.142

pour apres la rechercher dans :

17.4.3.1.2.0.31.91.233.220.142

Donc j'avais penser à supprimer le début a partir du 11e caractere puis rajouter un prefixe...

mais le probleme c'est que il s'agit d'une adresse de MIB( en réseau), donc ce script fonctionne parfaitement chez moi mais sur un autre pc ,
17.4.3.1.1.0.31.91.233.220.142
s'affiche en fait comme ceci
iso.4.3.1.1.0.31.91.233.220.142
donc le 11e caractere n'est plus le meme ,

c'est pourquoi je voudrais selectionner les 6 derniers champs puis rechercher dans le 2e tableau une chaine se finissant par la meme partie.

voila la partie de code qui correspond a ce que je fais actuellement :

//recherche dans le tableau 1
$result = array_search($hex, $array1);

// on retire les 11 premiers caractères de la chaine
$new_result = substr($result,11,strlen($result ));
// on y ajoute un autre prefixe
$bridge = substr_replace($new_result, '17.4.3.1.2.', 0, 0) ;
//recherche du n° de bridge
$result_bridge = $array2[$bridge];



merci beaucoup pour votre aide

12 réponses

Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 11:29
Hum je suis pas spécialiste mais je t'aiderai dans la mesure de mes (petits) moyen. En utilisant un explode tu peux stocker ta chaine dans un tableau en coupant à chaque point, ensuite tu concaténe uniquement les 6 derniers champs du tableau. Je sais pas si ça sera très claire pour toi^^'.
0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 12:58
en fait pour la premiere etape j'ai fait comme cela :

//recherche dans le tableau 1
$result = array_search($hex, $array1);
//On garde les 6 derniers champs
$ary_orig = explode('.', $result);
$ary_dest = array_slice($ary_orig, -6);
$str_dest = join('.', $ary_dest);


=> sa me donne les 6 derniers champs :-)


maintenant pour rechercher cette chaine dans le deuxieme tableau ?
je sais que pour préciser la fin d'une chaine c'est '$' mais si je recherche '$bridge$' (se finissant par la variabble bridge cela ne veut pas marché. En recherchant directement de cette maniere cela m'éviterait d'avoir a remplacer le début de la chaine qui change selon les pc et donc éviter les errreurs.

en fait le but de la manip c'est de récupérer le port d'un switch depuis l'adresse mac d'un pc.

on a 4 array de type :



[17.4.3.1.1.0.8.116.52.141.38] => Hex: 00 08 XX XX XX XX

[17.4.3.1.2.0.8.116.52.141.38] => 14

[17.1.4.1.2.14] => 14

[ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.14] => Fa0/14



On part de l'adresse Mac pour arrivé a Fa0/xx ...

une fois que j'ai extrait la fin de la premiere ligne je dois le chercher dans le 2e tableau pour avoir l'index 14 que je rechercherait a la fin du 3e tableau etc ...

voila j'espere que c'est plus clair
0
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 13:08
Ou se situe les 6 caractères dans le deuxième tableau?
0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 13:19
Enfait voila 4 tableau a mettre en relation

j'entre une addresse mac que je retrouve dans le premier tableau, la je capture les 6 dernier "champs" :
[17.4.3.1.1.0.8.116.52.141.38] => Hex: 00 08 XX XX XX XX

Je recherche ces champs dans le 2e tableau :
[17.4.3.1.2.0.8.116.52.141.38] => 14
Puis grace a l'index 14 , je trouve la ligne :
[17.1.4.1.2.14] => 14
De meme :
[ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.14] => Fa0/14

Donc voila, si il ya une methode pour adapté un simple :

$result= $array2[$value];

pour ne rechercher que dans la derniere partie de la chaine j'aurais alors achevé une grande partie de mon projet.

merci bien
0
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 13:21
Ben au lieu de concaténer, teste les derniers champs avec les derniers champs etc etc... Etant donné que la fin est la même ça devrait être simple. En gros 1 seul array pour chaque tableau, et tu test chaque champs un à un en partant de la fin.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 13:28
Et je ne comprend pas comment tu obtiens le "14" (je suis nul en ce qui concerne adresse mac et tout ça).
0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 13:34
en fait,

j'explore les MIB des routeurs... c'est des tables contenant des tas d'info sur le routeur.

ici j'ai pris un exemple précis pour une adresse mac et je l'ai suivi du 1e jusqu'au dernier tableau.
1 - numero de MIB correspondant a l'adresse MAC
2 - Mib donnant index du bridge
3 - Passe de l'index au numero de Bridge
4 - Numero de bridge sert a localiser le port.

ça c'est les conclusion que j'ai tiré en parcourant les tableaux ... donc en cherchant le résultat donné par un tableau a la fin des données dans le suivant voila le tour est joué !

mais comment faire pour comparer la valeur que j'ai en variable avec les 15 derniers caracteres par exemple du tableau suivant ...

c'est just cette commande qu'il me manque.
avec :
$result= $array2[$value];

j'ai la valeur correspondant a $value dans le tableau 2, mais si je veut la valeur qui se termine par $value ???


j'espere que je me suis bien expliqué ;-)

merci
0
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 13:39
La valeur qui se termine par la place dans le tableau? Je comprend pas... (je comprend vite mais faut m'expliquer longtemps)^^'
0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 13:47
ok lol ...

Reprenons le 1e exemple ,

[17.4.3.1.1.0.8.116.52.141.38] => Hex: 00 08 XX XX XX XX

[17.4.3.1.2.0.8.116.52.141.38] => 14

uniquement les 2 premiers car pour l'instant je suis bloqué la, puis une fois ce probleme résolu la suite va s'enchainé.

Donc j'entre une Adresse mac : 00 08 XX XX XX XX
Je traite sa valeur ( jy rajoute" Hex :" car c'est comme cela qu'elle est nommé dans le routeur )

Je recherche l'identifiant qui a pour valeur cette adresse ( ça je sais faire ) , jobtien :
17.4.3.1.1.0.8.116.52.141.38
Ceci va me servir a rechercher dans le tableau suivant, car les identifiant sont PRESQUE les memes :

Je conserve uniquement les 6 derniers champs :
0.8.116.52.141.38

Voila ...
ici on va dire $value = '0.8.116.52.141.38'

Maintenant je souhaite rechercher dans le 2e tableau les lignes contenant(ou se finissant par) $value

Si je peut limiter ma recherche a 'n' champs en aprtant de la fin c'est parfait je pourrait répété la commande pour la suite .

Compris? lol
0
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 14:11
Une recherche sur 'n' champ en partant de la fin?
Fais un explode sur tes deux identifiants à comparer
//fais donc une boucle
$nbtest=6;
$cmpt=0;

if($nbtest=!$cmpt)
{
 //tu fais tes tests champs par champs en commençant par la fin
ton test;
$cmpt++
}

0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 14:17
En fait je crois on se compren mal :

exemple j'ai un array :

ds2f13ABC => blabla
xsdezBBA => blabla2
aaezezaABBC => blabla3

quel commande permet d'obtenir "blabla" en sachant uniquement que la clé se finit par ABC ?
0
Devilish Messages postés 1425 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 26 janvier 2009 38
18 avril 2008 à 14:58
L'ordre de la clé est elle importante? Ou on peut avoir ACB ABC CAB BAC BDAC?
0
elmarokinho Messages postés 58 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 6 février 2009 4
18 avril 2008 à 15:07
non c'est important ...
sinon j'ai pensé a sa :

foreach($array2 as $cle => $element)
{
$ary_orig = explode('.', $cle); //parcours les clés
$ary_dest = array_slice($ary_orig, -6); //garde les 6 derniers groupes séparés par des points
$new_result2 = join('.', $ary_dest);
//a partir de la c'est nimporte quoi
$result_bridge = $array2[$new_result2];
echo $result_bridge ;

}


lool ... en fait je réduit la clé du tableau au 6 derniers champs et je recherche dans ce nouveau tableau mais sa ne marche pas !
0