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 2 tableaux associatifs


Sujet :

Langage PHP

  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Comparaison de 2 tableaux associatifs
    Bonsoir,

    J'ai 3 familles de produits.

    J'ai 3 tableaux, 1 par famille de produits issu de requetes MySql, contenant chacun les départements et le nombre de clients.
    A l'origine mes tableaux sont comme ceci
    Famille 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            '0' => array(
                '0' => '01',
                'champ_departement' => '01',
                '1' => '2',
                'nbrclient' => '2',
            ),
    '1' => array(
                '0' => '02',
                'champ_departement' => '02',
                '1' => '5',
                'nbrclient' => '5',
            ),
    Famille 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            '0' => array(
                '0' => '01',
                'champ_departement' => '01',
                '1' => '7',
                'nbrclient' => '7',
            ),
    '1' => array(
                '0' => '03',
                'champ_departement' => '03',
                '1' => '3',
                'nbrclient' => '3',
            ),
    Au final je veux ce résultat
    Famille 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
            '0' => array(
                '0' => '01',
                'champ_departement' => '01',
                '1' => '2',
                'nbrclient' => '2',
            ),
    '1' => array(
                '0' => '02',
                'champ_departement' => '02',
                '1' => '5',
                'nbrclient' => '5',
            ),
    '2' => array(
                '0' => '03',
                'champ_departement' => '03',
                '1' => '0',
                'nbrclient' => '0',
            ),
    Famille 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
            '0' => array(
                '0' => '01',
                'champ_departement' => '01',
                '1' => '7',
                'nbrclient' => '7',
            ),
    '1' => array(
                '0' => '03',
                'champ_departement' => '03',
                '1' => '3',
                'nbrclient' => '3',
            ),
    '0' => array(
                '0' => '02',
                'champ_departement' => '02',
                '1' => '0',
                'nbrclient' => '0',
            ),
    Chaque departement n'a pas obligatoirement un client.

    Je veux que chaque tableau de famille soit compléter du ou des departements qui lui manque.

    Est-il possible comparer des tableaux associatifs et de voir les différences pour les ajouter ensuite dans le tableau auxquels elles manquent autrement qu'en faisant une boucle qui lirait poste par poste le 1er tableau et qui regarderait si la clé existe sur le tableau 2 puis 3 et ensuite le tableau avec le 1 et le 3 etc...

    Merci pour vos conseils

  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
    Déja si tu ne recoltais pas un index numerique et un index associatif, tu simplifierais grandement la lecture de ton tableau et tu diminueriais de moitié sa taille.

    La boucle n'est pas une solution nulle ; il faut par contre construire ton tableau avec le département comme index.

    En resumé tu as un tableau ultra simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    array (
                     '01' => 2,
                     '02'=> 5
            )
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Merci, effectivement la réflexion va etre simplifié avec de tels tableaux.

    J'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    array(
    '01' => '2',
    '02' => '5',
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    array(
    '01' => '7',
    '03' => '3',
    );

  4. #4
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Donc j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $differences = array_diff_key($tableau_familles_1], $tableau_famille_2);
    Ce qui me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    array(
    '02' => '5',
    );
    Je veux maintenant ajouter ce résultat au tableau 2

    Dans mon euphorie, j'ai fait un array_merge, mais c'est une fausse bonne idée, car array_merge ne respecte pas les clés. Il faut donc faire une boucle pour appliquer les différences sur le tableau 2 comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(!empty($differences))
    {
        foreach($differences as $key => $difference)
        {
            $tableau_2[$key] = $difference;
        }
    }
    Voila il ne reste plus qu'à faire une boucle pour comparer

    le tableau 1 avec la tableau 2, le 2 avec le 3, le 1 avec la 3, le 3 avec le 1 et le 3 avec le 2 et oui le array_diff_key ne renvoie les différences que dans un sens ce qui est normal donc il faut jouer de toutes les combinaisons pour comparer tous les tableaux.

  5. #5
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Pour comparer tous les tableaux entre eux, j'ai fait en partant d'un tableau composé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    array([famille_1]=>array(
    '01' => '2',
    '02' => '5',
    )
    [famille_2]=>array(
    '01' => '7',
    '03' => '3',
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    $table_famille = array(famille_1, famille_2, famille_3);
    for($i = 0; $i < count($table_famille); $i++)
    {
        $j = $i + 1;
        // Ascendant
        for($k = $j; $k < count($table_famille) - $i; $k++)
        {
            $differences = array_diff_key($tableau_resultats[$table_famille[$i]], $tableau_resultats[$table_famille[$k]]);
            if(!empty($differences))
            {
                foreach($differences as $key => $difference)
                {
                    $tableau_resultats[count($table_famille)[$k]][$key] = 0;
                }
            }
        }
        // Descendant
        for($k = $j; $k < count($table_famille) - $i; $k++)
        {
            $differences = array_diff_key($tableau_resultats[$table_famille[$k]], $tableau_resultats[$table_famille[$i]]);
            if(!empty($differences))
            {
                foreach($differences as $key => $difference)
                {
                    $tableau_resultats[$table_famille[$i]][$key] = 0;
                }
            }
        }
    }
    Bonne continuation

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

Discussions similaires

  1. Comparaison de 2 tableaux associatifs
    Par Furil dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2013, 14h38
  2. Définition "inline" de tableaux associatifs.
    Par Blustuff dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/03/2010, 13h49
  3. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  4. [Tableaux] Comparaison de 2 tableaux
    Par vodasan dans le forum Langage
    Réponses: 9
    Dernier message: 10/01/2008, 08h51
  5. [Collections]Tableaux associatifs
    Par sheura dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 18/12/2005, 14h10

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