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 :

Comparer et supprimer les doublons de 2 arrays


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 212
    Par défaut Comparer et supprimer les doublons de 2 arrays
    Je cherche une bonne méthode pour :
    1 - Faire la comparaison de 2 array qui ont les même champs (un array BDD et un array CSV avec les champs [ numero | nom | type | note ] ) et trouver les identiques par rapport à leur numéro !
    2 - comparer chaque champs des tableaux ayant ces numéro identiques, pour vérifier s'il y a une différence entre ces 2 versions
    3 - Sortir les différences entre ces 2 tableaux

    Un exemple :
    tableau dans la BDD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    | numero |    nom     |    type    | note |
    |   245  |     café   |  boisson   |   5  |
    |   158  |    banane  |   fruit    |   3  | 
    |   954  |    poulet  |  viande    |   4  | 
    |   335  |     brie   |  fromage   |   6  |
    tableau dans le CSV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | numero |    nom     |    type    | note  |
    |  655   |    pates   |  feculant  |   8   |
    |  158   |    kiwi    |    fruit   |   2   |
    En 1 ca va comparer les 2 tableau et me donner le numéro 158 car c'est le seul numero qui est identique dans les 2 tableaux
    En 2 on va regarder les 2 entrées identique et voir qu'on a le nom et la note qui diffère
    Et en 3 on va afficher
    - nom : banane -> kiwi
    - note : 3 -> 2

    Pour le moment je suis parti la dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $records = $csv->getRecords();                   
    foreach ($records as $record){                         
         $numCSV[] = $record['numero'];
    }
    foreach ($produits as $produit){
           $numDB[] = $produit->getNumero();
    }
    $numCommun = array_intersect(numCSV, $numDB)
    J'ai bien les numéro en commun qui resortent mais après je bloc un peu sur la méthode

    Merci

  2. #2
    Invité de passage
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2026
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Services de proximité

    Informations forums :
    Inscription : Janvier 2026
    Messages : 2
    Par défaut
    Salut ! Bon, je vais te dire franchement : tu te prends la tête pour rien 😄

    Ta méthode avec array_intersect() et unset() ? Ça marche, mais c'est lourd. Y a vraiment plus simple.

    Utilise juste array_diff() et c'est bon :

    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
    $nouvelles = array_diff($array_csv, $array_bdd);
     
    foreach ($nouvelles as $entree) {
    // tu insères dans la BDD
    }
     
    Voilà. T'as tes nouvelles entrées, tu les mets en base. Fini.
     
    Si vraiment tu veux passer par l'intersection (genre pour tracker les doublons), ok :
     
    $doublons = array_intersect($array_csv, $array_bdd);
    $cles = array_keys($doublons);
     
    foreach ($cles as $cle) {
    unset($array_csv[$cle]);
    }
    Mais honnêtement, c'est du surplus. array_diff() fait le job en une ligne.

    Par contre, ça dépend vraiment de ce que tu compares. Si c'est des arrays simples avec juste des valeurs, pas de souci. Mais si t'as des structures plus complexes (genre des arrays avec plusieurs colonnes), faut qu'on regarde ça de plus près. C'est quoi exactement ta structure ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 212
    Par défaut
    Merci JT mais j'ai légèrement modifié mon message entre temps ! Et quand j'ai enregistrer mon changement j'ai vu que tu m'avais répondu !
    Du coup je sais pas si ta réponse colle toujours avec ma question ! :p

    Désolé

  4. #4
    Invité de passage
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2026
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Services de proximité

    Informations forums :
    Inscription : Janvier 2026
    Messages : 2
    Par défaut
    Ah ok, là c'est différent ! T'es pas loin, mais tu bloques au mauvais endroit.

    Le truc, c'est que tu récupères juste les numéros en commun, mais après tu sais plus d'où ils viennent. Faut que tu gardes la trace des données complètes.

    Voici comment je ferais :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    $records = $csv->getRecords();
    $produits = /* ta liste BDD */;
     
    // Crée des arrays indexés par numéro pour y accéder facilement
    $csv_par_numero = [];
    foreach ($records as $record) {
        $csv_par_numero[$record['numero']] = $record;
    }
     
    $db_par_numero = [];
    foreach ($produits as $produit) {
        $db_par_numero[$produit->getNumero()] = $produit;
    }
     
    // Trouve les numéros en commun
    $numeros_communs = array_intersect(
        array_keys($csv_par_numero),
        array_keys($db_par_numero)
    );
     
    // Pour chaque numéro en commun, compare les champs
    $differences = [];
    foreach ($numeros_communs as $numero) {
        $csv_data = $csv_par_numero[$numero];
        $db_data = $db_par_numero[$numero];
     
        $diff_pour_ce_numero = [];
     
        // Compare chaque champ
        foreach (['nom', 'type', 'note'] as $champ) {
            $valeur_csv = $csv_data[$champ];
            $valeur_db = $db_data->{'get' . ucfirst($champ)}(); // ou getNote(), getNom(), etc
     
            if ($valeur_csv != $valeur_db) {
                $diff_pour_ce_numero[$champ] = [
                    'avant' => $valeur_db,
                    'apres' => $valeur_csv
                ];
            }
        }
     
        if (!empty($diff_pour_ce_numero)) {
            $differences[$numero] = $diff_pour_ce_numero;
        }
    }
     
    // Affiche les différences
    foreach ($differences as $numero => $diffs) {
        echo "Numéro $numero :\n";
        foreach ($diffs as $champ => $valeurs) {
            echo "- $champ : {$valeurs['avant']} -> {$valeurs['apres']}\n";
        }
    }
    L'idée clé : au lieu de juste garder les numéros, tu indexe tes arrays par numéro. Comme ça tu peux accéder directement aux données complètes quand tu les compares.

    Ça te paraît clair ou tu veux que je détaille un truc ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 212
    Par défaut
    Merci JT ! Ca me semble pas mal effectivement je ne connaissais pas la fonction array_keys() !
    Si j'ai bien compris dans l'ensemble, au lieu d'insérer uniquement les valeurs du champ numéro (et donc avoir une clé auto en incrémentation), tu insères dans un tableau vide les numéros pour en faire la clé et le reste des champs en valeurs !
    Par contre je rencontre un autre souci pour l'étape d'après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     foreach (['nom', 'type', 'note'] as $champ) {
            $valeur_csv = $csv_data[$champ];
            $valeur_db = $db_data->{'get' . ucfirst($champ)}(); // ou getNote(), getNom(), etc
    Si le nom des champs est différent ? par exemple sur le CSV on a "nom" et sur la db on a "name" ?
    De plus certains titre de champs et certaines valeurs du CSV on des caractères spéciaux... J'ai regardé via notepad et les CSV sont en ASCII et je dois donc les changer en UTF-8 (si j'ai bien suivit) ! J'ai évidement fait quelques recherche sur internet pour pouvoir convertir ! j'ai pas vraiment trouvé! J'ai testé avec mb_detect_encoding() mais je ne crois pas l'utiliser correctement
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date = $record[mb_detect_encoding("Date déposé")];
    De plus je crois que ca marche que pour des variable contenant des chaine de caractère, donc si je dois encodé tout un CSV je ne pense pas que ca soit la bonne méthode

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 369
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 369
    Billets dans le blog
    17
    Par défaut
    Si tu as des divergences de noms de colonnes alors il faut faire un mapping, c'est-à-dire un tableau de correspondance.

    Montre-nous où tu en es et donne un exemple avec des noms de colonnes qui divergent.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

Discussions similaires

  1. Supprimer les doublons d'un array
    Par pierrot10 dans le forum jQuery
    Réponses: 2
    Dernier message: 22/12/2020, 17h01
  2. Comparer deux feuilles et supprimer les doublons
    Par xoco07 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/03/2014, 21h30
  3. [XL-2007] Comparer deux feuilles et supprimer les doublons
    Par trhibal dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/07/2011, 04h18
  4. Comparer deux feuilles et supprimer les doublons
    Par Lison Lisette dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/10/2010, 23h35
  5. Comparer des colonnes dans 2 feuilles différentes et supprimer les doublons
    Par eudeline91 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/04/2008, 10h24

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