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 :

merger des tableaux après requêtes [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut merger des tableaux après requêtes
    Bonjour,

    J'ai un petit soucis concernant l'utilisation des tableaux.

    Voici le code en question :
    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
    $qcs = "
    	SELECT
    	C.id as cid,
    	C.order as corder,
    	C.name as cname
    		FROM ci_categories AS C
    		ORDER BY `corder` ASC
    ";
    $categories = $this->db->query($qcs);
    $cs = $categories->result_array();
     
    echo 'Categories';
    $this->print_pre($cs);
     
     
    foreach ($cs as $c){
    	$cid = $c['cid'];
     
    	$qps = "
    		SELECT
    		P.id AS pid,
    		P.name AS pname,
    		P.price AS pprice
    			FROM ci_products AS P
    			WHERE $cid = P.category_id
    			ORDER BY	pprice ASC
    	";
    	$products = $this->db->query($qps);
    	$ps = $products->result_array();
    	$c['cproducts']=$ps;
     
    	echo 'Categories et produits';
    	$this->print_pre($c);
     
    	foreach ($ps as $p){
    		$pid = $p['pid'];
    		$qis = "
    			SELECT
    			I.name AS ingredient_name
    				FROM ci_ingredients AS I
    					LEFT JOIN ci_recipies as R
    					ON (I.id = R.ingredient_id)
    				WHERE (R.product_id = $pid)
    				ORDER BY ingredient_name ASC
    		";
    		$ingredients = $this->db->query($qis);
    		$is = $ingredients->result_array();
    		$p['pingredients'] = $is;
     
    		echo 'produits et ingredients';
    		$this->print_pre($p);
    	}
    }
    Et voici le résultat obtenu :
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    Categories
     
    Array
    (
        [0] => Array
            (
                [cid] => 5
                [corder] => 1
                [cname] => 1st category
            )
     
        [1] => Array
            (
                [cid] => 7
                [corder] => 2
                [cname] => 2nd category
            )
     
    )
     
     
    Categories et produits
     
    Array
    (
        [cid] => 5
        [corder] => 1
        [cname] => 1st category
        [cproducts] => Array
            (
                [0] => Array
                    (
                        [pid] => 1
                        [pname] => Azer
                        [pprice] => 13.00
                    )
     
                [1] => Array
                    (
                        [pid] => 2
                        [pname] => Poimlk
                        [pprice] => 25.50
                    )
     
            )
     
    )
     
     
    produits et ingredients
     
    Array
    (
        [pid] => 1
        [pname] => Azer
        [pprice] => 13.00
        [pingredients] => Array
            (
                [0] => Array
                    (
                        [ingredient_name] => D
                    )
     
                [1] => Array
                    (
                        [ingredient_name] => F
                    )
     
            )
     
    )
     
     
    produits et ingredients
     
    Array
    (
        [pid] => 2
        [pname] => Poimlk
        [pprice] => 25.50
        [pingredients] => Array
            (
                [0] => Array
                    (
                        [ingredient_name] => A
                    )
     
                [1] => Array
                    (
                        [ingredient_name] => D
                    )
     
                [2] => Array
                    (
                        [ingredient_name] => H
                    )
     
                [3] => Array
                    (
                        [ingredient_name] => R
                    )
     
            )
     
    )
     
     
    Categories et produits
     
    Array
    (
        [cid] => 7
        [corder] => 2
        [cname] => 2nd category
        [cproducts] => Array
            (
                [0] => Array
                    (
                        [pid] => 3
                        [pname] => 3rd recipe
                        [pprice] => 16.25
                    )
     
            )
     
    )
     
     
    produits et ingredients
     
    Array
    (
        [pid] => 3
        [pname] => 3rd recipe
        [pprice] => 16.25
        [pingredients] => Array
            (
            )
     
    )
    Mon soucis du moment :
    Comment faire pour merger tous ces tableaux en un seul gros tableau comprenant toutes les informations imbriquées ?
    En l'occurence, pour le moment, j'arrive à récupérer les catégories, les produits, les ingrédients, mais je n'arrive pas à faire un gros tableau de tout ça.

    Merci d'avance pour toute aide.

    PS : la fonction print_pre() est juste une fonction de mise en page des tableaux (éduivalent de print_r() mais mis en page pour faciliter la lecture)

  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
    Bonsoir,

    Ne vaudrait-il pas mieux joindre tes 3 requetes ?

    Sinon pour mon avis personnel, c'est peut etre plus facile de travailler sur 3 tableaux catégorisés que sur un seul tableau avec une arborescence infernale.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut
    Qu'entends tu par joindre les 3 requêtes ?

    Ceci ?
    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
    $query ="
    SELECT
    	P.id AS id,
    	P.name AS name,
    	P.price AS price,
    	C.name AS category,
    	R.ingredient_id AS ingredient_id,
    	I.name AS ingredient_name
     
    	FROM ci_products AS P
    		LEFT JOIN ci_categories as C
    			ON (C.id = P.category_id)
     
    		LEFT JOIN ci_recipies AS R
    			ON (R.product_id = P.id)
     
    		LEFT JOIN ci_ingredients AS I
    			ON (R.ingredient_id = I.id)
    	ORDER BY C.`order` ASC, price ASC, I.name ASC
    ";
    $results = $this->db->query($query);
    $result = $results->result_array();
    $this->print_pre($result);
    Dans ce cas, j'obtiens en effet bien un tableau à utilisable, mais avec des traitement à faire:
    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
    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => Azer
                [price] => 13.00
                [category] => 1st category
                [ingredient_id] => 54
                [ingredient_name] => D
            )
     
        [1] => Array
            (
                [id] => 1
                [name] => Azer
                [price] => 13.00
                [category] => 1st category
                [ingredient_id] => 53
                [ingredient_name] => F
            )
     
        [2] => Array
            (
                [id] => 2
                [name] => Poimlk
                [price] => 25.50
                [category] => 1st category
                [ingredient_id] => 50
                [ingredient_name] => A
            )
     
        [3] => Array
            (
                [id] => 2
                [name] => Poimlk
                [price] => 25.50
                [category] => 1st category
                [ingredient_id] => 54
                [ingredient_name] => D
            )
     
        [4] => Array
            (
                [id] => 2
                [name] => Poimlk
                [price] => 25.50
                [category] => 1st category
                [ingredient_id] => 56
                [ingredient_name] => H
            )
     
        [5] => Array
            (
                [id] => 2
                [name] => Poimlk
                [price] => 25.50
                [category] => 1st category
                [ingredient_id] => 57
                [ingredient_name] => R
            )
     
        [6] => Array
            (
                [id] => 3
                [name] => 3rd recipe
                [price] => 16.25
                [category] => 2nd category
                [ingredient_id] => 
                [ingredient_name] => 
            )
     
    )
    J'ai du mal à concevoir comment faire le traitement pour ne pas dupliquer les redondances lors de l'affichage ...

    Quoi qu'il en soit, pour ce projet, l'arborescence n'ira jamais au delà de categories/produits/ingredients, donc ce n'est pas trop compliqué à gérer.

    De plus, je dois envoyer à ma vue les données en une fois, il me faut de toute facon un moyen pour combiner les tableaux.

    Une piste pour m'orienter ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut
    Ca y'est, j'ai trouvé la solution. Il m'a fallu un peu de temps, mais en fait c'était pas compliqué, juste trouver l'idée.

    J'ai simplement rajouté un compteur, et j'envoie les données de chaque sous requête dans le tableau initial.

    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
    $qcs = "
    	SELECT
    	C.id as cid,
    	C.order as corder,
    	C.name as cname
    		FROM ci_categories AS C
    		ORDER BY `corder` ASC
    ";
    $categories = $this->db->query($qcs);
    $cs = $categories->result_array();
     
    $c_c = 0; // Initialisation du compteur de categorie
    foreach ($cs as $c){
    	$cid = $c['cid'];
     
    	$qps = "
    		SELECT
    		P.id AS pid,
    		P.name AS pname,
    		P.price AS pprice
    			FROM ci_products AS P
    			WHERE $cid = P.category_id
    			ORDER BY	pprice ASC
    	";
    	$products = $this->db->query($qps);
    	$ps = $products->result_array();
    	$cs[$c_c]['cproducts']=$ps
     
    	$c_p = 0; // Initialisation du compteur de produit
    	foreach ($ps as $p){
    		$pid = $p['pid'];
    		$qis = "
    			SELECT
    			I.name AS ingredient_name
    				FROM ci_ingredients AS I
    					LEFT JOIN ci_recipies as R
    					ON (I.id = R.ingredient_id)
    				WHERE (R.product_id = $pid)
    				ORDER BY ingredient_name ASC
    		";
    		$ingredients = $this->db->query($qis);
    		$is = $ingredients->result_array();
    		$cs[$c_c]['cproducts'][$c_p]['pingredients'] = $is;
    		$c_p++;
    	}
    	$c_c++;
    }
    $this->print_pre($cs);
    Le résultat, attendu :
    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
    75
    76
    77
    78
    Array
    (
        [0] => Array
            (
                [cid] => 5
                [corder] => 1
                [cname] => 1st category
                [cproducts] => Array
                    (
                        [0] => Array
                            (
                                [pid] => 1
                                [pname] => Azer
                                [pprice] => 13.00
                                [pingredients] => Array
                                    (
                                        [0] => Array
                                            (
                                                [ingredient_name] => D
                                            )
     
                                        [1] => Array
                                            (
                                                [ingredient_name] => F
                                            )
                                    )
                            )
     
                        [1] => Array
                            (
                                [pid] => 2
                                [pname] => Poimlk
                                [pprice] => 25.50
                                [pingredients] => Array
                                    (
                                        [0] => Array
                                            (
                                                [ingredient_name] => A
                                            )
     
                                        [1] => Array
                                            (
                                                [ingredient_name] => D
                                            )
     
                                        [2] => Array
                                            (
                                                [ingredient_name] => H
                                            )
     
                                        [3] => Array
                                            (
                                                [ingredient_name] => R
                                            )
                                    )
                            )
                    )
            )
     
        [1] => Array
            (
                [cid] => 7
                [corder] => 2
                [cname] => 2nd category
                [cproducts] => Array
                    (
                        [0] => Array
                            (
                                [pid] => 3
                                [pname] => 3rd recipe
                                [pprice] => 16.25
                                [pingredients] => Array
                                    (
                                    )
                            )
                    )
            )
    )
    Comme ça, je peux envoyer $cs dans ma vue, et avec une simple routine foreach(), je peux faire mettre en page le contenu.

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

Discussions similaires

  1. [AC-2007] Sélectionner des éléments après une requète
    Par jisa64 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/04/2011, 10h43
  2. [MySQL] Créer des tableaux en PHP avec pour nom le resultat fournit par requête SQL
    Par arrakis75 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/01/2009, 13h49
  3. [MySQL] Récupérer le nom des champs après exécution d'une requête
    Par GanYoshi dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/07/2008, 12h13
  4. Réponses: 4
    Dernier message: 09/06/2007, 23h49
  5. [Conception] Utiliser les fonctions des tableaux ou plusieurs requêtes ?
    Par Derik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 01/02/2006, 09h54

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