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 éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    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
    Nouveau candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2026
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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 éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    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
    Nouveau candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2026
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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 éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    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 377
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 377
    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.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    Par défaut
    Salut ! Merci Séb !

    alors voici mon code pour le moment (controller) :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
        #[Route('/signalement/upload', name: 'signalement.upload', methods:['GET', 'POST'])]
        public function upload(
            Request $request,
            SluggerInterface $slugger,
            EntityManagerInterface $manager,
            SignalementRepository $repository,
             #[Autowire('%kernel.project_dir%/public/uploads/')] string $fileDirectory
        )  : Response {
                $upload = new Upload();
                $form = $this->createForm(ImportType::class, $upload);
                $form->handleRequest($request);
                $signalements = $repository->findAll();           
                if ($form->isSubmitted() && $form->isValid()) {
                    $csvFile = $form -> get('csvFile')->getData();           
                    if($csvFile){
                        $originalFileName = pathinfo($csvFile->getClientOriginalName(), PATHINFO_FILENAME);             
                        $safeFileName = $slugger->slug($originalFileName);        
                        $newFileName = $safeFileName.'-'.uniqid().'.'.$csvFile->guessExtension();                   
                        $csvFile->move($fileDirectory, $newFileName);                    
                        $upload->setCsvFile($newFileName);              
                        $manager->persist($upload);           
                        $csv = Reader::createFromPath($fileDirectory.$newFileName);              
                        $csv->setHeaderOffset(0);
                        $csv->setDelimiter(';');
                        $csv->setEscape('');
                        $records = $csv->getRecords();  
                        $CSVParNum = [];                 
                        foreach ($records as $record){                        
                            $CSVParNum[$record['Identifiant de la fiche']] = $record;                        
     
                            $structure = $manager->getRepository(Structure::class)->findOneBy(['nom' => $record['Nom de la structure']]);                
                            $date = $record["Date d'emission de la fiche"];
                            $dbdate = \DateTimeImmutable::createFromFormat('d/m/Y', $date);
                            $signalement = (new Signalement())
                                ->setNumero($record['Identifiant de la fiche'])
                                ->setType($record['ESiN ou Portail'])
                                ->setDate($dbdate)
                                ->setCasO($record['Cas origine'])
                                ->setCasC($record['Cas cloture'])
                                ->setCommentaire($record['Commentaire'])
                                ->setEpidemie($record['Type de cas'])
                                ->setStructure($structure)                                                          
                                ;
     
                                $manager->persist($signalement);                       
                                $manager->persist($structure);
                        } 
     
                        $DBParNum = [];
                        foreach ($signalements as $signalement){
                            $nbxDsLaDB[] = $signalement->getNumero();  
                            $DBParNum[$signalement->getNumero()] = $signalement;                                                 
                        }
                        $NbenCommun = array_intersect(
                            array_keys($CSVParNum),
                            array_keys($DBParNum)
                        );
                        dd($NbenCommun, $CSVParNum, $DBParNum);
     
                        $diff = [];
                        foreach ($NbenCommun as $Nb){
                            $CSVdata = $CSVParNum[$Nb];
                            $DBdata = $DBParNum[$Nb];
                            $diffAvecCeNum = [];
                        }                                  
                    }
                    $manager->flush();
                    $this->addFlash('success','Bien ajouté avec succès');
                    return $this->redirectToRoute('signalement.index');
                }
            return $this->render('pages/signalement/upload.html.twig',
                ['form' => $form,]);
        }
    Et voici un extrait du csv
    Nom : csv.PNG
Affichages : 274
Taille : 15,6 Ko

    Donc si on fait une liste des champs sur le csv -> dans la BDD on a :
    Identifiant de la fiche -> numero
    ESIN ou Portail -> type
    Date d'emission de la fiche -> date
    Cas origine -> CasO
    Cas cloture -> CasC
    Commentaire -> commentaire
    Type de cas -> epidemie
    Nome de la structure -> structure

    Pour le moment, pour mes tests, il n'y pas de caractère spéciaux des 2 côté ! mais si j'en met par exemple sur "Date d'émission" dans le CSV, j'ai un message d'erreur : Warning: Undefined array key "Date d'emission de la fiche".

    Si je change dans mon code en ligne 33 $date = $record["Date d'émission de la fiche"];, j'ai le même message d'erreur.

    Edit :

    J'ai tchecké la doc et un autre site pour faire le mapping avec notamment array_mapping()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                        function map_Alert(string $var1, string $var2): array{
                            return [$var1 => $var2];
                        }
     
                        $a = ['Identifiant de la fiche','ESiN ou Portail',"Date d'émission de la fiche",'Cas origine','Cas cloture', 'Commentaire Type de cas', 'Nom de la structure'];
                        $b = ['numero', 'type', 'date', 'casO', 'casC', 'commentaire', 'structure'];
     
                        $var3 = array_map('map_Alert', $a, $b);
    Mais ca m'affiche une autre erreur ! array_map(): Argument #1 ($callback) must be a valid callback or null, function "map_Alert" not found or invalid function name Décidément !

    Edit 2 :

    j'ai remplacer $var3 = array_map('map_Alert', $a, $b); par $var3 = array_map(null, $a, $b); et j'ai enfin un résultat avec un "dd" cependant je me demande si c'est bien de mettre un null :/

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    Par défaut
    Je fais un petit up de ce message ! Je suis toujours bloqué !

    J'ai évidement continué à chercher mais pour le moment je ne trouve pas !

    Pour le moment le seul bout de code qui me met un peu sur la voix c'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $NbenCommun = array_intersect(
                              array_keys($CSVParNum),
                              array_keys($DBParNum)
    );
    Mais ca me donne que les numéros et moi j'aimerais avoir tout le reste

    Voici mon code entier :
    https://codeshare.io/aJ8jeq

    Merci

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 563
    Par défaut
    Bonjour,

    Code php : 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
    <?php
    //Supposons que les données csv et db sont comme suite : 
    $dbRecords=[
    	["numero"=>245,"nom"=>"café","type"=>"boisson","note"=>5],
    	["numero"=>335,"nom"=>"brie","type"=>"fromage","note"=>6],
    	["numero"=>158,"nom"=>"banane","type"=>"fruit","note"=>3],
    	["numero"=>954,"nom"=>"poulet","type"=>"viande","note"=>4]
    ];
    $csvRecords=[
    	["Identifiant de la fiche"=>655,"Nom de la structure"=>"pates","Commentaire Type de cas"=>"feculant","note"=>8],
    	["Identifiant de la fiche"=>158,"Nom de la structure"=>"kiwi","Commentaire Type de cas"=>"fruit","note"=>2]
    ];
     
    $combinedKeys = array_combine(array_keys($csvRecords[0]),array_keys($dbRecords[0]));
     
    $filteredRows=array_filter($dbRecords,function($a) use($csvRecords){
    	return in_array($a["numero"],array_column($csvRecords,"Identifiant de la fiche"));
    });
     
    foreach($filteredRows as $key => &$value){
    	foreach($combinedKeys as $csvColName=>$dbColName){
    		$similaire=array_column(
    			array_filter($csvRecords,function($v) use ($value){
    				return $v["Identifiant de la fiche"]==$value["numero"];
    			})
    		,$csvColName);
    		array_push($similaire,$value[$dbColName]);
    		$similaire=array_unique($similaire);
    		if($dbColName!="numero")
    			if( count($similaire)>1) $value[$dbColName]=implode(" , ",$similaire);
    			else unset($filteredRows[$key][$dbColName]); 
    	}
    }
    var_dump($filteredRows);
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    array(1) {
      [2]=>
      &array(3) {
        ["numero"]=>
        int(158)
        ["nom"]=>
        string(13) "banane , kiwi"
        ["note"]=>
        string(5) "3 , 2"
      }
    }
    Concernant l'erreur de map_Alert, rappelle-toi que tu écris ton code dans une classe et donc array_map devient aveugle et ne reconnait plus la méthode map_Alert.

    Pour corriger ça il faut déclarer map_Alert comme une méthode de la classe y compris $a et $b comme des propriétés, puis écrire array_map([$this,'map_Alert'], $this->a, $this->b)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    Par défaut
    Merci beaucoup Toufik ! Cependant je n'arrive pas a adapter ton exemple à mon code des la ligne 14 :

    J'ai juste fais un dd() de mon premier tableau : dd($CSVRows[0]); J'ai un message d'erreur car ce tableau est créé via un foreach (voir message de JT Studio Web)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $records = $csv->getRecords();                   
    $CSVRows = [];                    
    foreach ($records as $record){            
        $CSVRows[$record['Identifiant de la fiche']] = $record;
       /.../
    }
    Mon tableau $CSVRows a pour clé les identifiants de fiche et non 0, 1, 2, 3 etc...

    voici le dd($CSVRows) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    2 in SignalementController.php on line 242:
    array:5 [▼
      11156 => array:21 [▶]
      45474 => array:21 [▶]
      77777 => array:21 [▶]
      12587 => array:21 [▶]
      98989 => array:21 [▶]
    ]
    De plus, l'un des 2 tableaux est composé d'objet alors que l'autre est composé de tableaux !

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 563
    Par défaut
    Bonjour,

    Pour adapter mon code, remplace la ligne 14 par ceci
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $csvFirstElement=array_values($csvRecords)[0];
    $dbFirstElement=array_values($dbRecords)[0];
    $combinedKeys = array_combine(array_keys($csvFirstElement),array_keys($dbFirstElement));

    Ou bien
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $csvFirstElement=reset($csvRecords);
    $dbFirstElement=reset($dbRecords);
    $combinedKeys = array_combine(array_keys($csvFirstElement),array_keys($dbFirstElement));

    Ou
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $csvFirstElement=$csvRecords[array_key_first($csvRecords)];
    $dbFirstElement=$dbRecords[array_key_first($dbRecords)];
    $combinedKeys = array_combine(array_keys($csvFirstElement),array_keys($dbFirstElement));

    Sauf que array_key_first ne fonctionne qu'avec une version de PHP supérieure ou égale à 7.3.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 221
    Par défaut
    Encore merci Toufik de prendre le temps de me répondre !
    J'ai bien essayé tes 3 solutions mais elles me donnent toutes le même message d'erreur :
    array_keys(): Argument #1 ($array) must be of type array, App\Entity\Signalement givenVoici les dd de $csvFirstElement et de $dbFirstElement :

    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
     
    1 in SignalementController.php on line 241:
    array:21 [▼
      "Identifiant de la fiche" => "11156"
      "ESiN ou Portail" => "ESIN"
      "Date d'emission de la fiche" => "12/09/2025"
      "Cas origine" => "1"
      "Cas cloture" => "6"
      "Commentaire" => "Ceci est un commentaire bidon"
      "Type de cas" => "epidemie"
      "Capacite de gestion locale" => "OK"
      "Gravite" => "Gravite averee"
      "Impact echelle" => "oui"
      "Mesures efficaces" => "oui"
      "Mesure conforme aux reco" => "oui"
      "Population a risque" => "Population non a risque ou non applicable"
      "Score" => "52"
      "Type infection" => "Cutane"
      "Agent etiologique" => "ISO"
      "Nom de la structure" => "EHPAD HOTEL DIEU"
      "Score ARS" => "vert"
      "Score ES" => "rouge"
      "Score CPIAS" => "bleu"
      "Score SPF" => ""
    ]
    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
    54
    55
     
    2 in SignalementController.php on line 241:
    App\Entity\Signalement {#1234 ▼
      -id: 2
      -numero: 326594
      -type: "Portail"
      -date: DateTimeImmutable @1746489600 {#1228 ▶}
      -casO: 1
      -casC: 2
      -commentaire: "qaqaqaxbsjyhxgslghslxglxgzjxgzjygzjysgjzyvjhgfzdejhgcecgjhcgejh,cgjcg"
      -epidemie: "Épidémie"
      -gravite: "Aucun critère de gravité ou non applicable"
      -population: "Immunodéprimés Nouveau-nés et prémaRéanimation Dialyse EHPAD"
      -reco: "Oui"
      -mesure: "Non"
      -capacite: "OK"
      -impact: "Non"
      -score: 15
      -infection: Proxies\__CG__\App\Entity
    \
    Infection {
    #1261 ▶}
      -etiologie: Proxies\__CG__\App\Entity
    \
    Etiologie {
    #1281 ▶}
      -structure: Proxies\__CG__\App\Entity
    \
    Structure {
    #1312 ▶}
      -service: Doctrine\ORM
    \
    PersistentCollection {
    #1339 ▶}
      -souche: Doctrine\ORM
    \
    PersistentCollection {
    #1336 ▶}
      -contact: Doctrine\ORM
    \
    PersistentCollection {
    #1349 ▶}
      -agent: Doctrine\ORM
    \
    PersistentCollection {
    #1371 ▶}
      -ARS: "vert"
      -clotureARS: DateTimeImmutable @1748476800 {#1229 ▶}
      -ES: "aucune"
      -clotureES: DateTimeImmutable @1747008000 {#1230 ▶}
      -CPIAS: "rouge"
      -clotureCPIAS: DateTimeImmutable @1746403200 {#1231 ▶}
      -SPF: "vert"
      -clotureSPF: DateTimeImmutable @1746403200 {#1232 ▶}
    }

  13. #13
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 563
    Par défaut
    Bonjour,

    Ah d'accord, le problème est donc lié au deuxième tableau qui représente des Objets Signalements de type class, ce n'est pas grave on peut contourner ceci.

    Tout d'abord, j'ai essayé de créer une classe simple "Signalement" afin que l'exemple soit plus proche de ce que tu as comme code (ne copie pas cette classe, utilise celle que tu as).
    Code php : 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
    54
    55
    56
    <?php
    class Signalement {
    	public $numero; public $nom;public $type; public $note;
    	public function __construct($numero_,$nom_,$type_,$note_){
    		$this->numero=$numero_; $this->nom=$nom_;$this->type=$type_;$this->note=$note_;
    	}
    	//getters
    	public function getNumero(){return $this->numero;}
    	public function getNom(){return $this->nom;}
    	public function getType(){return $this->type;}
    	public function getNote(){return $this->note;}
    	//setters
    	public function setNom($nom_){$this->nom=$nom_;}
    	public function setType($type_){$this->type=$type_;}
    	public function setNote($note_){$this->note=$note_;}
    }
     
    //Supposons que les données csv et db sont comme suite : 
    $dbRecords=[
    	new Signalement (245,"café","boisson",5),
    	new Signalement (655,"brie","fromage",6),
    	new Signalement (158,"banane","fruit",3),
    	new Signalement (954,"poulet","viande",4)
    ];
    $csvRecords=[
    	["Identifiant de la fiche"=>655,"Nom de la structure"=>"pates","Commentaire Type de cas"=>"feculant","note structure"=>8],
    	["Identifiant de la fiche"=>158,"Nom de la structure"=>"kiwi","Commentaire Type de cas"=>"fruit","note structure"=>2],
    	["Identifiant de la fiche"=>158,"Nom de la structure"=>"jus d'orange","Commentaire Type de cas"=>"boisson","note structure"=>4]
    ];
     
    $csvFirstElement=array_values($csvRecords)[0];
    $dbFirstElement=array_values($dbRecords)[0];
    $combinedKeys = array_combine(array_keys($csvFirstElement),array_keys(get_object_vars($dbFirstElement)));
     
    $filteredRows=array_filter($dbRecords,function($a) use($csvRecords){
    	return in_array($a->getNumero(),array_column($csvRecords,"Identifiant de la fiche"));
    });
     
    foreach($filteredRows as $key => &$signal){
    	foreach($combinedKeys as $csvColName=>$dbColName){
    		$similaire=array_column(
    			array_filter($csvRecords,function($v) use ($signal){
    				return $v["Identifiant de la fiche"]==$signal->getNumero();
    			})
    		,$csvColName);
     
    		$getMethodName="get".ucfirst($dbColName);$setMethodName="set".ucfirst($dbColName);
     
    		array_push($similaire,$signal->$getMethodName());
    		$similaire=array_unique($similaire);
    		if($dbColName!="numero")
    			if( count($similaire)>1) $signal->$setMethodName(implode(" , ",$similaire));
    			else unset($filteredRows[$key]->$dbColName);// Ou bien réinitialiser la valeur à null $signal->$setMethodName(null)
    	}
    }
    var_dump($filteredRows);

    Résultat
    Code php : 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
    array(2) {
      [1]=>
      object(Signalement)#2 (4) {
        ["numero"]=>
        int(655)
        ["nom"]=>
        string(12) "pates , brie"
        ["type"]=>
        string(18) "feculant , fromage"
        ["note"]=>
        string(5) "8 , 6"
      }
      [2]=>
      &object(Signalement)#3 (4) {
        ["numero"]=>
        int(158)
        ["nom"]=>
        string(28) "kiwi , jus d'orange , banane"
        ["type"]=>
        string(15) "fruit , boisson"
        ["note"]=>
        string(9) "2 , 4 , 3"
      }
    }

    Cas particulier : Les méthodes magiques __set __get et __unset
    Si vous essayez d'accéder/modifier/supprimer une propriété privée ou protégée depuis l'extérieur de la classe, PHP ne pourra pas y accéder directement. Pour gérer cela, vous devez implémenter les méthodes magiques à l'intérieur de votre classe.

    Si tu veux que le script fonctionne quand même avec tous les types de propriétés possibles (public,protected,private), tu dois implémenter l'interface JsonSerializable class Signalement implements JsonSerializable{.....} qui permet d'utiliser la méthode abstraite jsonSerialize() pour convertir l'objet Signalement en un tableau associatif personnalisé lors d'un appel à json_encode(), donc en gros, deux méthodes à rajouter dans la classe Signalement + l'implémentation de l'interface
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Signalement implements JsonSerializable{
           /*....le code de la classe .... */
            public function jsonSerialize():array{
    		return $this->objectToArray();
    	}
    	private function objectToArray() : array{
    		return ["numero"=>$this->numero,"nom"=>$this->nom,"type"=>$this->type,"note"=>$this->note];
    	}
    }

    Après la ligne 14 devient plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $csvFirstElement=array_values($csvRecords)[0];
    $dbFirstElement=array_values($dbRecords)[0];
    $dbFirstElement=json_decode(json_encode($dbFirstElement),true);
    //Les deux tableaux doivent avoir la même longueur, sinon array_combine renvoi une erreur.
    $combinedKeys = array_combine(array_keys($csvFirstElement),array_keys($dbFirstElement));

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