PHP merger des tableaux

Résolu/Fermé
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 - 23 mars 2009 à 22:39
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 - 24 mars 2009 à 01:42
Bonsoir,

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

Voici le code en question :
$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 :
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 seules, les catégories avec les produits imbriqués, les produits avec les ingrédients imbriqués, 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 (équivalent de print_r())

1 réponse

gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 330
24 mars 2009 à 01:42
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.

$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 :
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.
0