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

PHP & Base de données Discussion :

Comment trier les données dans un tableau


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut Comment trier les données dans un tableau
    Bonsoir à tous,

    Voila j'ai des données provenant de ma base de donnée sous cette forme:
    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
    array (size=3)
      0 => 
        object(Order_model)[27]
          public 'firstname' => string 'Deeptha' (length=7)
          public 'lastname' => string 'Wickrema' (length=8)
          public 'id_customer' => string '2' (length=1)
          public 'id_order' => string '3' (length=1)
          public 'date_add' => string '2013-12-08 05:10:26' (length=19)
          public 'product_name' => string 'iPod shuffle - Couleur : Vert' (length=29)
      1 => 
        object(Order_model)[26]
          public 'firstname' => string 'Deeptha' (length=7)
          public 'lastname' => string 'Wickrema' (length=8)
          public 'id_customer' => string '2' (length=1)
          public 'id_order' => string '2' (length=1)
          public 'date_add' => string '2013-12-08 05:09:39' (length=19)
          public 'product_name' => string 'iPod Nano - Capacité : 16Go, Couleur : Noir' (length=44)
      2 => 
        object(Order_model)[28]
          public 'firstname' => string 'Deeptha' (length=7)
          public 'lastname' => string 'Wickrema' (length=8)
          public 'id_customer' => string '2' (length=1)
          public 'id_order' => string '2' (length=1)
          public 'date_add' => string '2013-12-08 05:09:39' (length=19)
          public 'product_name' => string 'iPod touch - Capacité : 8Go' (length=28)
    Comme vous pouvez le constatez parfois il se peut que le client commande plusieurs produits appartenant a la même commande, c'est pour cela que le id_order = 2 apparaît deux fois de suite.

    Ce que je souhaiterai c'est recréer une représentation des données sous cette forme:
    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 => 
        object(Order_model)[27]
          public 'firstname' => string 'Deeptha' (length=7)
          public 'lastname' => string 'Wickrema' (length=8)
          public 'id_customer' => string '2' (length=1)
          public 'id_order' => string '3' (length=1)
          public 'date_add' => string '2013-12-08 05:10:26' (length=19)
          public 'product_name' => string 'iPod shuffle - Couleur : Vert' (length=29)
    
    
      1 => 
        object(Order_model)[26]
          public 'firstname' => string 'Deeptha' (length=7)
          public 'lastname' => string 'Wickrema' (length=8)
          public 'id_customer' => string '2' (length=1)
          public 'id_order' => string '2' (length=1)
          public 'date_add' => string '2013-12-08 05:09:39' (length=19)
          public 'product_name' => string 'iPod Nano - Capacité : 16Go, Couleur : Noir' (length=44)
          public 'product_name' => string 'iPod touch - Capacité : 8Go' (length=28)
    Je voudrais simplement ajouter chaque nom de produit de nouveau produit portant le même id_order.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    ce n'est pas possible en l'état.
    Dans ton code product_name étant de type string ne pourra compiler tous les articles commandés.
    Pour ce faire, tu devrais plutôt utiliser un tableau et factoriser les données : une même commande aura toujours les mêmes informations (id, client, date...) pas la peine de dupliquer tout ça en autant de fois que d'articles commandés.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Est ce que je dois changer le type de donnée, c'est a dire avoir un type tableau plutôt qu'objet?

  4. #4
    Membre actif
    Profil pro
    Responsable de service informatique
    Inscrit en
    Août 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 174
    Points : 232
    Points
    232
    Par défaut
    Bonjour,

    Quelle est la structure de tes tables ?

    J'ai tendance à penser qu'il n'y a pas de table lignes_commandes ?

    Natso

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Alors voici la représentation merise de mes 3 tables concernant la partie commande:



    Voici ma requête SQL:

    Code sql : 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
    SELECT 
        `o`.`id_order`,
        `c`.`firstname`,
        `c`.`lastname`,
        `o`.`id_customer`,
        `o`.`date_add`,
        `od`.`product_name`
    FROM
        (`pss_orders` o)
            LEFT JOIN
        `pss_order_detail` od ON `od`.`id_order` = `o`.`id_order`
            LEFT JOIN
        `pss_customer` c ON `c`.`id_customer` = `o`.`id_customer`
    WHERE
        `o`.`id_customer` = 2
            AND `o`.`id_lang` = 1

    Je fait 2 jointure sur deux tables pss_order_detail et pss_customer.

    Cette requête lorsque je l'exécute sur MySQLlWorkbench j'ai ces resultats:


  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Est ce que çà serait pas mieux si je faisait ma requête en deux étapes:

    1- je fait une requête pour avoir la liste des commandes

    2- une autre requête pour avoir la liste des produits associé aux commandes

    De ce fait je pourrais combiner le résultat de ma deuxième requête afin de créer mon tableau.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    par rapport à ce que je t'ai dit, voici une soluce :
    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
    <?php
     
    $sql = <<<'SQL'
    SELECT
        `o`.`id_order`,
        `c`.`firstname`,
        `c`.`lastname`,
        `o`.`id_customer`,
        `o`.`date_add`,
        `od`.`product_name`
    FROM
        `pss_orders` o
            INNER JOIN `pss_order_detail` od ON `od`.`id_order`   = `o`.`id_order`
            INNER JOIN `pss_customer`      c ON `c`.`id_customer` = `o`.`id_customer`
    WHERE
        `o`.`id_customer` = 2
        AND `o`.`id_lang` = 1
    ORDER BY
        `o`.`id_order`
        `od`.`product_name`
    SQL;
     
    $orders = array();
     
    foreach ($data as $row) // data = résultat de ta requête
    {
        $idc = $row['id_customer'];
     
        if ( ! isset($orders[$idc]))
        {
            $orders[$idc] = array(
                'firstname' => $row['firstname'],
                'lastname'  => $row['lastname'],
                'orders'    => array()
            );
        }
     
        if ( ! isset($orders[$idc]['orders'][$row['id_order']]))
        {
            $orders[$idc]['orders'][$row['id_order']] = array();
        }
     
        $orders[$idc]['orders'][$row['id_order']][] = $row['product_name'];
    }
    Je considère qu'une commande ne peut exister sans client et qu'une commande sans détails ne peut également exister (d'ou les INNER JOIN)

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    C'est génial !
    Vous avez réussi à faire ce que je voulais
    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
    {
        "order": {
            "2": {
                "firstname": "Deeptha",
                "lastname": "Wickrema",
                "orders": {
                    "2": [
                        "iPod Nano - Capacité : 16Go, Couleur : Noir",
                        "iPod touch - Capacité : 8Go"
                    ],
                    "3": [
                        "iPod shuffle - Couleur : Vert"
                    ],
                    "7": [
                        "iPod Nano - Capacité : 16Go, Couleur : Noir"
                    ],
                    "8": [
                        "iPod shuffle - Couleur : Vert"
                    ],
                    "9": [
                        "iPod shuffle - Couleur : Vert"
                    ],
                    "10": [
                        "iPod shuffle - Couleur : Vert",
                        "MacBook Air - Capacité : Disque dur SSD (solid-state drive) de 64 Go , Couleur : Metal, Processeur : Intel Core 2 Duo à 1,6 GHz",
                        "iPod touch - Capacité : 8Go"
                    ]
                }
            }
        }
    }

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Est ce que vous pourriez m'expliquer votre algo svp?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ah mon code a besoin d'explications ?

    Bah c'est simple, une fois les données récupérées, mon code les parcourt et les réorganise selon le besoin afin d'avoir un tableau final empilant les données de cette manière
    id_customer => array(
        firstname => '',
        lastname  => '',
        orders    => array(
            id_order => array(
                product_name_1,
                product_name_2,
        ),
    ),
    
    Dans le code, les isset(...) vérifient l'existence des clés. Si elles n'existent pas, elles sont créées en conséquence avec les valeurs par défaut afin d'être remplies par la suite du traitement.

Discussions similaires

  1. [DisplayTag] Problème pour trier les dates dans un tableau
    Par Pascale38 dans le forum Taglibs
    Réponses: 13
    Dernier message: 01/09/2006, 09h58
  2. Réponses: 13
    Dernier message: 18/01/2006, 12h51
  3. Trier les données dans 1 tableau par ordre décroissant
    Par Blunet dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 23/11/2005, 09h56
  4. Réponses: 3
    Dernier message: 18/10/2005, 13h43
  5. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03

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