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 :

les fonctions récursives et les array


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut les fonctions récursives et les array
    Bonjour,
    j'ai un problème que je comprends pas trop et j'ai jamais vraiment comprit.
    C'est les fonctions récursives, visuellement mon array est remplie, mais la fonction qui le lance ne la pas ou pas en entier.

    Voici la base de données qui sert a faire les jointures:
    Nom : Capturephp.PNG
Affichages : 189
Taille : 60,3 Ko

    Mon but c'est récupérer des nombres en bdd jusqu'à ce qu'il y en est plus.

    Par exemple le nombre 9 est lié au nombre 4, le nombre 4 est lié au 1 et ainsi de suite et moi il me faut la liste sauf qu'un nombre peut en avoir plusieurs et il faut tout récupérer, le 9 est aussi lié au 6 par exemple. C'est un peut comme une arborescence de fichier/dossier en quelque sorte

    J'ai vraiment du mal a comprendre comment on fait avec la récursivité quand il faut remplir un array, le résultat obtenu est souvent déroutant. Quand je boucle et que je log je vois mon array remplie, mais a l’endroit ou il y la fonction de lancer on voit qu’il y a que le premier niveau de l’array

    Voici le code:
    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
     
    	function recipe_sql($recipe_id, $bdd)
    	{
    		$requete_sql = 'SELECT * FROM `recipe_group_link`
    		LEFT JOIN recipes ON recipes.recipe_id = recipe_group_link.recipe_id
    		LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    		WHERE recipes.recipe_id = :recipe_id';
    		$stmt = $bdd->prepare($requete_sql);
    		$stmt->execute(array(
    			'recipe_id' => $recipe_id,
    		));
    		$stmt->setFetchMode(PDO::FETCH_ASSOC);
    		$recipes =  $stmt->fetchAll();
    		errorInfoSQL($stmt);
    		return $recipes;
    	}
     
    	function recipes_recursive($recipe_id, $bdd, $array)
    	{
    		$recipe_sql = recipe_sql($recipe_id, $bdd);
    		// krumo($recipe_sql);
     
    		foreach($recipe_sql as $key => $value)
    		{
    			// krumo($value);
    			echo '[ '.$value['recipe_id'].' '.$value['recipe_name'].' ] ';
    			$array[] = $value;
    			// krumo($array);
    			recipes_recursive($value['recipe_id'], $bdd, $array);
    			echo '<br>';
    		}
    		return $array;
    	}
    Visuellement la fonction fait le taff, mais pas avec le tableau. Pour le moment j'ajoute tout ce que la bdd donne avec la jointure, mais il faudrait que si je comprends comment faire que j'utilise que les nombre

    Merci pour votre aide, car la je bloque

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    La structure ne me paraît pas claire
    Que cherches-tu à représenter ?
    Qui est parent ? Qui est enfant ? Y-a-t-il seulement ce genre de relation ?
    Tu veux représenter quel genre de graphe ? As-tu une idée de sa représentation ?

    Pour le moment je vois ceci :

    Nom : f443.png
Affichages : 155
Taille : 12,7 Ko

    C'est un peut comme une arborescence de fichier/dossier
    Un dossier a 0,n fichiers et 0,n dossiers (enfants)
    Un fichier a 1 unique dossier (parent)
    C'est beaucoup plus simple et ne correspond en rien à ce que tu nous montres

  3. #3
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Je cherche a lier les nombres entre eux, c'est des recettes qui ont besoin d'une autre recette et ainsi de suite, comme je disais le 9 a besoin du 6 et du 4, le 6 a besoin du 10 qui lui a besoin du 1, c'est pour ça que je disais que c'est un peut comme une arborescence de fichier d'une certaine manière.

    J'ai fait a la main un array pour avoir une idée comment je pourrais le faire, mais c'est peut être pas la meilleur façon(c'est le même exemple afficher d'une autre manière):
    Nom : Capturephp.PNG
Affichages : 156
Taille : 184,0 Ko

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    si tu étais lycéen en août 2012, je te souhaites avoir quitté ce statut 11 ans après

    Séb. est d'un bon conseil.

    Pour décrire la table, j'utiliserais sa DDL ; ça serait plus clair.
    Peut-être te tourner vers le forum https://www.developpez.net/forums/f6...sation/schema/

  5. #5
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    J'avais pas vu pour le statut lycée^^.


    J'ai réussi a obtenir quelque chose avec ces codes:
    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
     
    	function recipes_recursive($recipe_id, $bdd, $array, $key_)
    	{
    		$recipe_sql = recipe_sql($recipe_id, $bdd);
     
    		if(empty($array2))
    			{
    				$array2 = array();
    			}
    		else
    			{
    			}
    		foreach($recipe_sql as $key => $value)
    		{
    			// krumo($value);
    			// echo '[ '.$value['recipe_id'].' '.$value['recipe_name'].' ] ';
    			if($key == count($recipe_sql)-1)
    				{
    					$array2[ $key_."_".$value['recipe_id'] ] =  $key_.'_'.$value['recipe_id']." > ".$key." ".count($recipe_sql);
    				}
    			else
    				{
    				}
    			$array2[$key_."_".$value['recipe_id'] ] = recipes_recursive($value['recipe_id'], $bdd, $array, $key_."_".$value['recipe_id']);
    		}
    		$r =  array_merge($array2, $array);
    		return $r;
    	}
     
    	function boucle_recursive($array)
    	{		
    		foreach($array as $key => $value)
    		{
    			if(count($value) > 0)
    				{
    					boucle_recursive($value);
    				}
    			else
    				{
    					echo "=> ".$key.'<br>';
    				}
    		}
    	}
    mais c'est pas top, car ça me donne un truc comme ça:
    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
    array(2) {
        [19_9] = array(2) {
            [19_9_4] = array(1) {
                [19_9_4_1] = array(0) {
                }
            }
            [19_9_6] = array(1) {
                [19_9_6_10] = array(1) {
                    [19_9_6_10_1] = array(0) {
                    }
                }
            }
        }
        [19_10] = array(1) {
            [19_10_1] = array(0) {
            }
        }
    }
    et j'ai réussi a garder que ça:
    => 19_9_4_1
    => 19_9_6_10_1
    => 19_10_1

    et après il faut que je traites les nombres pour les utiliser.... mais j'ai pas réussi a faire mieux

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Pour décrire la table, j'utiliserais sa DDL ; ça serait plus clair.
    Comme vu ta copie d'écran, tu utilises PhpMyAdmin, fais un export et donne la DDL de la table
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE `recipe_group_link` (`recipe_group_link_id` int NOT NULL AUTO_INCREMENT,
    etc

  7. #7
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    DDL c'est quoi ?

    Ca:
    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
     
    CREATE TABLE `recipe_group_link` (
      `recipe_group_link_id` int NOT NULL,
      `recipe_id` int NOT NULL,
      `recipe_group_id` int NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
     
    --
    -- Déchargement des données de la table `recipe_group_link`
    --
     
    INSERT INTO `recipe_group_link` (`recipe_group_link_id`, `recipe_id`, `recipe_group_id`) VALUES
    (1, 4, 1),
    (2, 9, 4),
    (3, 9, 6),
    (4, 11, 12),
    (5, 13, 12),
    (6, 10, 1),
    (7, 8, 11),
    (8, 5, 1),
    (9, 5, 18),
    (10, 6, 10),
    (11, 7, 1),
    (12, 19, 9),
    (13, 19, 10);

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Oui : https://fr.wikipedia.org/wiki/Langag...e_donn%C3%A9es Data Definition Language. Dans ton code, lignes 2 à 6...

    Je laisse les spécialistes (dont je ne fais pas partie) te proposer une solution.

    Chu étonné, car les clés étrangères ne sont pas décrites et pourtant, les 3 colonnes de la table sont des clés étrangères.

  9. #9
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    C'est grave de pas d'écrire "les clés étrangères" ? Je fais mes jointures pour les utiliser et cela fonctionne toujours

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Je te conseille de poser ta question sur ce forum : https://www.developpez.net/forums/f9...ysql/requetes/. Tu auras toutes les chances d'avoir une réponse, contrairement au forum courant.

  11. #11
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    j'ai créé en local la table et testé la requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM `recipe_group_link`
    		LEFT JOIN recipes ON recipes.recipe_id = recipe_group_link.recipe_id
    		LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    		WHERE recipes.recipe_id = 4
    Réponse de MysqlWorkbench (logiciel gestionnaire SQL, équivalent de PhpMyAdmin) : Error Code: 1146. Table 'dvp.recipes' doesn't exist (dvp est le nom que j'ai donné à la bdd). Je vois que dans la requête, tu mentionnes les tables recipes et re1. Peux tu donner la DDL de ces 2 tables, STP ?

    Je sais pas quand je serai dispo pour te répondre (demain ? Pas sûr)

  12. #12
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    La table recipes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE `recipes` (
      `recipe_id` int NOT NULL,
      `recipe_main` int NOT NULL,
      `recipe_main_id` int NOT NULL,
      `recipe_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      `recipe_name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      `recipe_type_id` int NOT NULL,
      `buildings_id` int NOT NULL,
      `produced` float NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

  13. #13
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Ok
    Et la table re1 ?

  14. #14
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Comme c'est écrit ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    re1 c'est juste un alias de recipes autrement je peux pas faire la jointure, j'ai mit le texte au pif^^

  15. #15
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    j'ai passé un certain temps (plusieurs heures) à réfléchir sur ton problème. Bon, plusieurs heures, comme je ne suis pas très fort, ça veut pas dire grand chose...
    En fait, c'est pas clair.
    Ne pas décrire les clés étrangères, même si ça semble marcher, ça aide fortement à rendre plus compréhensible la structure de la bdd. En parlant de structure, ce qui me choque, c'est que tes tables n'ont pas de clé primaire.
    Autre chose : tu fais des jointures LEFT JOIN. Moi je ferais des INNER JOIN.

    Tu dis avoir mis le texte au pif. Mais quel texte ?

    Pour que ton besoin soit plus clair, mets un exemple de ce que tu souhaites obtenir, STP.

    Et la structure des tables, elle vient d'où ?

    Citation Envoyé par Lprofessionnelle Voir le message
    Comme c'est écrit ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    re1 c'est juste un alias de recipes autrement je peux pas faire la jointure, j'ai mit le texte au pif^^
    Je ne suis pas d'accord car je pense que LEFT JOIN re1 ON re1.recipe_id = recipe_group_link.recipe_group_id revient au même. D'autre part, la clause ON mentionne la table re1 , donc c'est pas juste un alias.

  16. #16
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Abandon comme pas compris ton besoin et que tu me réponds pas...

  17. #17
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Désolé, j'ai pas répondu avant.

    Quand j'ai besoin deux faire deux jointures et que c'est la même table comme ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    Au final la table re1 existe pas vu que c'est la table recipes d'ou le nom re1 mit au pif pour mes tests.
    --

    Mon besoin comme je l'ai dit c'est que ça soit en php ou mysql c'est de lier automatiquement les nombres entre eux dans un array.

    J'ai réussi a obtenir cela en allant de nombre en nombre:
    Nom : Capture_php.PNG
Affichages : 107
Taille : 16,1 Ko

    C'est compliqué a avoir ce résultat, car comme je l'ai dit c'est des fonctions récursives et je comprends pas comment ça fonctionne. Ca ressemble a rien et c'est pas utilisable, mais j'arrive pas a gérer l'array.
    Ensuite grace a la fonction array_walk_recursive j'ai pu récupérer une seul fois chaque valeur et je test si le dernier nombre est vraiment le dernier grâce a une requête sql, j'ai pas trouvé mieux, ce qui me donne mes 3 chaines de nombre, ainsi j'ai obtenu cette array final:
    Nom : Capture_php.PNG
Affichages : 105
Taille : 11,9 Ko

    C'est peut être pas la meilleur méthode, c'est peut être pas optimisé, mais pour le moment ça a l'air de fonctionner . J'aimerais juste mixé les 3 quand les nombres sont les même(les premières clés 0, 1,2 on s'en fous, c'est a partir de 19 qu'il faut garder), mais comment les combiner quand les clés sont les même ? Je n'ai toujours pas réussi.

    j'espère avoir été assez clair dans mes explications.

    --
    Ma fonction qui crée le tableau:
    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
     
    	function recipes_recursive($recipe_id, $bdd, $nb, $key_)
    	{
    		$recipe_sql = recipe_sql($recipe_id, $bdd);
    		// var_dump_($recipe_sql);
     
    		if(empty($array2))
    			{
    				$array2 = array();
    			}
    		else
    			{
    			}
    		foreach($recipe_sql as $key => $value)
    		{
    			$array2[ $key_.'_'.$value['recipe_id'] ] =  $key_.'_'.$value['recipe_id'];
    			$array2["key_".$key_."_".$value['recipe_id'] ] = recipes_recursive($value['recipe_id'], $bdd, $nb, $key_."_".$value['recipe_id']);
    		}
    		return $array2;
    	}
    Et la c'est le code qui prend dans le tableau seulement les chaines de nombres valides:
    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
     
    		// Le tableau et la connexion a la bdd:
    		$data_array = array(array(), $bdd);
    		array_walk_recursive( $recipes_recursive, function($value, $key) use (&$data_array) {
    			// J'explode la chaie de nombre:
    			$explode = explode("_", $value);
    			// Je test seulement le dernier nombre de la chaine pour savoir si c'est vraiment le dernier:
    			$recipe_sql = recipe_sql(end($explode), $data_array[1]);
    			// Si j'ai aucun résultat c'est le dernier:
    			if(count($recipe_sql) == 0)
    				{
    					$data_array[0][] = $explode; 
    				}
    			else
    				{
    				}
    		}, $data_array);
    		$data['recipes'] = $data_array[0];

  18. #18
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. Je ne suis pas le roi des fonctions récursives donc je doute de pouvoir t'aider de ce côté-là. Néanmoins, quelques questions qui pourraient servir à un spécialiste qui passe par là :

    - ta structure des tables, elle vient d'où ?

    - j'ai des doutes sur la requête de ton post #1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $requete_sql = 'SELECT * FROM `recipe_group_link`
    		LEFT JOIN recipes ON recipes.recipe_id = recipe_group_link.recipe_id
    		LEFT JOIN recipes AS re1 ON re1.recipe_id = recipe_group_link.recipe_group_id
    		WHERE recipes.recipe_id = :recipe_id';
    Le SELECT ne va afficher que des ID : c'est normal ?

    - Certes, je comprends un peu plus, mais :
    Citation Envoyé par Lprofessionnelle Voir le message
    Mon besoin comme je l'ai dit c'est que ça soit en php ou mysql c'est de lier automatiquement les nombres entre eux dans un array.
    Moi, je vois nulle part où c'est dit...Peux-tu donner un exemple de ce que tu souhaites obtenir ?

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 506
    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
    function get($dt){
    	global $pdo;
    	$data1=[];
    	$recipGroupIds=explode(",",$dt['recipe_group_id']);
    	foreach($recipGroupIds as $index=>$grpId){
    		$ex=explode(",",$dt["re1_recipe_id"]);
    		foreach($ex as $index1=>$recipId){
    			$data1[$grpId][$recipId]=explode(',',$dt["re1_recipe_group_id"]);
    		}
    	}
    	return $data1;
    }
    $pdo=new PDO("....","....","....",
    	[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]
    );
    $stmt=$pdo->query('SELECT distinct r.recipe_id
    ,group_concat(distinct r.recipe_group_id) as recipe_group_id
    ,group_concat(distinct r1.recipe_group_id) as re1_recipe_id
    ,group_concat(distinct r2.recipe_group_id) as re1_recipe_group_id
    FROM `recipe_group_link` r
    LEFT JOIN recipe_group_link r1 ON r1.recipe_id = r.recipe_group_id
    LEFT JOIN recipe_group_link r2 ON r2.recipe_id=r1.recipe_group_id
    group by r.recipe_id,r.recipe_group_id,r1.recipe_id,r1.recipe_group_id ');
    $rows=$stmt->fetchAll();
    foreach($rows as $index=>$row){
    	$data=get($row);
    	if(empty($d[$row['recipe_id']])) $d[$row['recipe_id']]=$data;
    	else $d[$row['recipe_id']][array_keys($data)[0]]=array_values($data)[0];
    }
    echo "<pre>";
    print_r($d);
    echo "</pre>";

    Résultat :
    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    Array
    (
        [4] => Array
            (
                [1] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [5] => Array
            (
                [1] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
                [18] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [6] => Array
            (
                [10] => Array
                    (
                        [1] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [7] => Array
            (
                [1] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [8] => Array
            (
                [11] => Array
                    (
                        [12] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [9] => Array
            (
                [4] => Array
                    (
                        [1] => Array
                            (
                                [0] => 
                            )
     
                    )
     
                [6] => Array
                    (
                        [10] => Array
                            (
                                [0] => 1
                            )
     
                    )
     
            )
     
        [10] => Array
            (
                [1] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [11] => Array
            (
                [12] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [13] => Array
            (
                [12] => Array
                    (
                        [] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
        [19] => Array
            (
                [9] => Array
                    (
                        [6] => Array
                            (
                                [0] => 10
                            )
     
                    )
     
                [10] => Array
                    (
                        [1] => Array
                            (
                                [0] => 
                            )
     
                    )
     
            )
     
    )
    C'est ce que vous cherchez à récupérer ?

  20. #20
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    j'avais raison d'espérer le passage d'un spécialiste car je suis largué par le code du jeune Toufik83 (en 1983, j'intégrais mon école d'ingé... )

Discussions similaires

  1. Les Fonctions récursives
    Par RondoudouBooleen dans le forum Fortran
    Réponses: 2
    Dernier message: 27/03/2012, 21h07
  2. fonction récursive pour générer les nbrs sur n bits
    Par simpatico dans le forum Débuter
    Réponses: 6
    Dernier message: 18/11/2011, 09h06
  3. [PHP 5.3] Fonction récursive : où placer les div ?
    Par renaud26 dans le forum Langage
    Réponses: 3
    Dernier message: 21/06/2011, 08h30
  4. Fonction récursive pour remplissage Array
    Par WibiMaster dans le forum Langage
    Réponses: 15
    Dernier message: 14/02/2011, 08h41
  5. fonction trim sur les array de array
    Par billyrose dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2009, 12h24

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