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 :

PHP array : fusionner des lignes selon une condition


Sujet :

Langage PHP

  1. #1
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Points : 604
    Points
    604
    Par défaut PHP array : fusionner des lignes selon une condition
    Bonjour à toutes et tous

    J'ai une petite problème dans la manipulation d'un tableau que je n'arrive pas à résoudre. J'ai un tableau avec un certain nombre de ligne et je souhaite faire des fusions de lignes en fonction d'une certaine condition : même pseudo et des dates qui se suivent.

    Par exemple voici un exemple de tableau que je peux avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [0] => ["id" => 125, "pseudo" => "tartanpion", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"]
    [1] => ["id" => 126, "pseudo" => "tartanpion", "date_debut" => "2021-12-16", "date_fin" => "2021-12-20"]
    [2] => ["id" => 127, "pseudo" => "gilette12", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"]
    [3] => ["id" => 128, "pseudo" => "grillepain", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"]
    [4] => ["id" => 129, "pseudo" => "tartanpion", "date_debut" => "2022-01-03", "date_fin" => "2022-01-05"]
    Dans cet exemple je souhaiterais fusionner la première et la deuxième ligne qui ont un pseudo identique et la date_debut de la deuxième ligne et le lendemain de la date_fin de la première ligne et donc obtenir le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [0] => ["id" => 125, "pseudo" => "tartanpion", "date_debut" => "2021-12-03", "date_fin" => "2021-12-20"]
    [1] => ["id" => 127, "pseudo" => "gilette12", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"]
    [2] => ["id" => 128, "pseudo" => "grillepain", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"]
    [3] => ["id" => 129, "pseudo" => "tartanpion", "date_debut" => "2022-01-03", "date_fin" => "2022-01-05"]

    Si vous voyez une possibilité via une requête SQL je suis aussi preneur, mais si vous voyez la solution en PHP je suis à l'écoute

    En espérant avoir été le plus clair possible, et je reste à disposition pour apporter des explications supplémentaires si besoin

    Merci d'avance pour vos retours
    Cordialement,
    Si vous voulez suivre les différents championnats de football américain en France, en Europe et dans le Monde (en tout 32 pays différents), c'est sur www.fandefootus.fr

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Tu peux faire quelque chose dans ce style :

    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
    $data = [
        ["id" => 125, "pseudo" => "tartanpion", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"],
        ["id" => 126, "pseudo" => "tartanpion", "date_debut" => "2021-12-16", "date_fin" => "2021-12-20"],
        ["id" => 127, "pseudo" => "gilette12", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"],
        ["id" => 128, "pseudo" => "grillepain", "date_debut" => "2021-12-03", "date_fin" => "2021-12-15"],
        ["id" => 129, "pseudo" => "tartanpion", "date_debut" => "2022-01-03", "date_fin" => "2022-01-05"],
    ];
     
    // Trier, c'est bien
    usort($data, fn ($a, $b) => $a['date_debut'] <=> $b['date_debut']);
     
    $result = [];
    foreach ($data as $data_item) {
        // Calcul du jour précédent la date_debut de l'élément courant
        // Pour voir si ça colle
        $previous_day = date('Y-m-d', strtotime("{$data_item['date_debut']} - 1 day"));
        $added = false; // Drapeau indiquant si l'insertion dans $result a été effectuée
        foreach ($result as $i => $result_item) { // Parmi les items du résultat, on vérifie si...
            if ($result_item['pseudo'] === $data_item['pseudo']) { // ... le pseudo correspond...
                if ($result_item['date_fin'] === $previous_day) { // ... et que la date début - 1 jour de l'élément en traitement est égale à la date de fin d'un élément déjà inséré précédemment ...
                    $result[$i]['date_fin'] = $data_item['date_fin']; // ... si oui on fusionne
                    $added = true; // On flague le traitement
                    break; // Et on sort de la boucle
                }
            }
        }
        if ($added === false) { // Si pas d'ajout/fusion...
            $result[] = $data_item; // ... on ajoute
        }
    }
     
    print_r($result);

    Donne :

    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
    (
        [0] => Array
            (
                [id] => 125
                [pseudo] => tartanpion
                [date_debut] => 2021-12-03
                [date_fin] => 2021-12-20
            )
        [1] => Array
            (
                [id] => 127
                [pseudo] => gilette12
                [date_debut] => 2021-12-03
                [date_fin] => 2021-12-15
            )
        [2] => Array
            (
                [id] => 128
                [pseudo] => grillepain
                [date_debut] => 2021-12-03
                [date_fin] => 2021-12-15
            )
        [3] => Array
            (
                [id] => 129
                [pseudo] => tartanpion
                [date_debut] => 2022-01-03
                [date_fin] => 2022-01-05
            )
    )
    Voilà, c'est une approche naïve qui fonctionne sur ton exemple et qu'il faudra tester dans différentes situations. On peut aussi faire un array_reduce().

    Avec du SQL le principe est le même, le critère de jointure sera double : (pseudo1 = pseudo2) et (date fin 1 = date debut 2 - 1 jour)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Points : 604
    Points
    604
    Par défaut
    Bonjour Séb. et merci pour votre réponse,

    Je suis effectivement parti sur une solution comme vous la proposez dans votre commentaire. La seule différence notable que j'ai (mais je pense que c'est selon les préférences de chacun) et l'utilisation d'un for plutôt que d'un foreach mais effectivement j'arrive à quelque chose de pas mal avec la méthode proposée

    Merci encore pour votre réponse
    Si vous voulez suivre les différents championnats de football américain en France, en Europe et dans le Monde (en tout 32 pays différents), c'est sur www.fandefootus.fr

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

Discussions similaires

  1. [XL-2013] Copier-Coller des lignes selon une condition
    Par psg7835 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/07/2017, 14h51
  2. VBA : Afficher des lignes selon une condition
    Par mery 20 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/12/2015, 10h42
  3. Supprimer des lignes selon une condition
    Par j0joo dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/03/2014, 14h40
  4. Fusionner des groupes selon une condition
    Par TCHdvlp dans le forum Jasper
    Réponses: 0
    Dernier message: 12/04/2012, 15h19
  5. Copier des lignes si une condition se realise
    Par abalboul dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/01/2008, 06h49

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