IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

comparaison de tableaux


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Par défaut comparaison de tableaux
    Bonjour,

    Pour faire simple et rapide, je dois comparer des adresses mac sur des ports d'équipements avant et après une opération de maintenance. Un script perl va me chercher ces renseignements et implémente une bdd.
    L'interfaçage utilisateur est en php.

    J'ai donc ce genre de données possibles pour les @mac:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $macAvant = explode("/", "/");
    $macAvant= explode("/", "AA BB CC 22 22 22/");
    $macAvant= explode("/", "AA BB CC 11 11 11/AA BB CC 22 22 22/AA BB CC 33 33 33/");
    bien sur, les mac sont normalement tirées de la bdd
    mais là où je voulais en venir, c'est qu'il peut y avoir 0, 1 ou plusieurs macs sur un même port, d'où le tableau.

    Le script perl trie les @mac, ce qui fait que les données de la bdd sont classées alpha-numériquement s'il y a plusieurs mac.

    Suite à ça, je vire le dernier item du tableau, qui est toujours vide:
    Après l'opération de maintenance, le port peut retrouver toutes ces mac, ou une partie, ou pas du tout :p
    mon tableau $macApres va donc avoir le même type de données que $macAvant
    Il se peut aussi que lors de la première prise de mac, il n'y ai qu'une seule mac sur le port, et qu'après l'opération, il y en ait plusieurs.
    J'aimerais savoir si au moins une adresse mac est commune dans les 2 tableaux.

    J'ai remarqué (et c'est ce qui me dérange) que suivant l'ordre des paramètres, la fonction array_intersect ne ramène pas le même résultat.

    Prenons un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $macAvant= explode("/", "AA BB CC 22 22 22/");
    $macApres = explode("/", "AA BB CC 11 11 11/AA BB CC 22 22 22/");
    array_pop($macAvant);
    array_pop($macApres );
    $macDiff1 = array_intersect($macApres , $macAvant);
    $macDiff2 = array_intersect($macAvant, $macApres );
    print "inter macApres  macAvant<br />";
    print_r($macDiff1);
    print "count: ".count($macDiff1)."<br />";
    print "inter macAvant macApres <br />";
    print_r($macDiff2);
    print "count: ".count($macDiff2)."<br />";
    macAvant :
    Array ( [0] => AA BB CC 22 22 22 )
    macApres :
    Array ( [0] => AA BB CC 11 11 11 [1] => AA BB CC 22 22 22 )

    inter macApres macAvant
    Array ( [1] => AA BB CC 22 22 22 ) count: 1
    inter macAvant macApres
    Array ( [0] => AA BB CC 22 22 22 ) count: 1
    La clé est conservée.
    Y a-t-il moyen de récupérer les valeurs communes sans index?

    Merci d'avance,

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pourquoi la valeur de l'index te pose un problème ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    C'est normal, array_intersect renvoie un tableau composé des paires clés valeurs du premier tableau dont les valeurs sont présentes dans le second.

    Pour dissocier les clés des valeurs d'un tableau, tu peux utiliser array_values.

    Au passage ne confonds pas array_intersect avec array_diff $macDiff1 = array_intersect(...)

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Pourquoi la valeur de l'index te pose un problème ?
    C'est une bonne question... qui résout mon souci! :p
    Je n'avais pas mis de array_pop au début de mon dev, du coup, quand j'avais des $macAvant = explode("/", "/");, ca me générait un count équivalent à 2. Alors qu'il n'y avait pas de mac :p
    Je ne pouvais pas me baser sur le count donc. et je voulais récupérer les valeurs de cet array_intersect pour voir si elles n'étaient pas vides (j'en avais toujours au moins une) sans faire de foreach sur tout le tableau, juste en prenant la première valeur. J'aurais pu utiliser array_shif....
    c'est 2 fonctions que je viens juste de découvrir en fait
    mais maintenant que j'ai ce array_pop, si le count est égal à 1 avec des mac vide, c'est qu'il n'y en avait ni avant, ni après. Maintenant je fais juste un if (count($macDiff1) != 0) { et c'est bon
    Merci de m'avoir fait réfléchir

    Citation Envoyé par Benjamin Delespierre Voir le message
    Au passage ne confonds pas array_intersect avec array_diff $macDiff1 = array_intersect(...)
    oui, c'est juste le nommage de ma variable qui n'est pas bon, j'utilisais array_diff en effet avant

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    S'il s'agit de dégager les valeurs vides (au sens large) array_filter est plus approprié

    $new_array = array_filter(array(false, 1, null, 2, 0, 3, '')); // il reste [1,2,3]

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Par défaut
    le souci de array_filter est que si je n'ai pas de mac avant et après, j'ai des tableaux vides.
    array_intersect ne ressortant rien, mon port apparaît en erreur après l'opération, alors qu'en fait non.
    Le fait de laisser une donnée vide me permet de la comparer et de ressortir une intersection

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de tableaux (PERL + MYSQL + CISCO)
    Par pat94 dans le forum Langage
    Réponses: 5
    Dernier message: 05/10/2007, 16h06
  2. comparaison deux tableaux
    Par bezoindaidde dans le forum Langage
    Réponses: 13
    Dernier message: 06/07/2007, 16h51
  3. Comparaisons de tableaux sur des feuilles différentes
    Par Olanor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2007, 08h32
  4. Comparaison de Tableaux
    Par Currahee dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 23/02/2007, 12h14
  5. [langage] Comparaison de tableaux
    Par WetzlarMan dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2004, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo