Trie sur un tableau php (récursivité) [Résolu/Fermé]

Signaler
Messages postés
149
Date d'inscription
samedi 27 juin 2009
Statut
Membre
Dernière intervention
23 juin 2015
-
 Utilisateur anonyme -
Bonjour tout le monde,

Avoir voilà, je vous explique mon problème, je récupère en base de données un tableau contenant des informations formaté comme suis :

Array
(
    [0] => stdClass Object
        (
            [id] => 5
            [name] => tutoriels
            [id_parent] => 0
            [level] => 1
        )

    [1] => stdClass Object
        (
            [id] => 6
            [name] => formation
            [id_parent] => 5
            [level] => 2
        )

    [2] => stdClass Object
        (
            [id] => 7
            [name] => formation1
            [id_parent] => 6
            [level] => 3
        )

    [3] => stdClass Object
        (
            [id] => 8
            [name] => formation2
            [id_parent] => 5
            [level] => 2
        )

    [4] => stdClass Object
        (
            [id] => 9
            [name] => tutoriels1
            [id_parent] => 10
            [level] => 2
        )

    [5] => stdClass Object
        (
            [id] => 10
            [name] => tutoriels
            [id_parent] => 0
            [level] => 1
        )

)


Et je voudrais avec une fonction récursive pouvoir le formater comme ceci :
array(
  [id] = name,
  [id] = name,
  [id] = name,
);


mais il faudrait en même temps une arborescence à l'intérieur du tableau selon les enfants par exemple :
array(
  [id] = _name,
  [id] = __name,
  [id] = ___name,
  [id] = _name,
);


En gros créer l'arborescence selon les parents/enfants qui sont récupéré.
et je ne vois pas comment faire.

Est ce que quelqu'un saurait me guider pour arriver à bout de ce tracas s'il vous plait ?
Merci beaucoup.
Ludo.

4 réponses


Bonjour

Si j'ai bien compris ton problème, il faut à chaque niveau de la récursivité d'afficher tous les descendants du niveau en question.
Il suffit donc de balayer le tableau de comparer l'id_parent des élements rencontrés, à l'id du niveau étudié. Si on rencontre un descendant, on l'affiche (ou on l'ajoute au tableau) et on appelle la fonction récursivement sur cet enfant, en lui passant au passage la chaîne à mettre avant le nom avec un _ de plus que son parent.
J'ai programmé un exemple, pas très cohérent car je passe le tableau de résultat en paramètre alors que je laisse le tableau d'entrée en global.
Au passage, on n'a pas besoin ici du champ 'level'
<?php

class maClass {
  public $id,$name,$id_parent,$level;
  function __construct($iid,$nname,$iid_parent,$llevel) {
    $this->id=$iid;
    $this->name=$nname;
    $this->id_parent=$iid_parent;
    $this->level=$llevel;
  }
} // maClass



function enfants(&$resultat, $id_parent,$extension) {
global $x;
  foreach ($x as $enfant) {
    if ($enfant->id_parent == $id_parent) {
      $resultat[$enfant->id]=$extension.$enfant->name;
      enfants($resultat, $enfant->id,$extension.'_');
    } // if
  } // foreach
} // function

// création des données d'entrée

$x=array();

$x[]=new maClass(5,'tutoriels',0,1);
$x[]=new maClass(6,'formation',5,2);
$x[]=new maClass(7,'formation1',6,3);
$x[]=new maClass(8,'formation2',5,2);
$x[]=new maClass(9,'tutoriels1',10,2);
$x[]=new maClass(10,'tutoriels',0,1);


$resultat = array();
enfants ($resultat,0,'_');

echo '<pre>';
print_r($resultat);
echo '</pre>';
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Salut, c'est le texte qui se formate(et les fichiers informatiques) pas les tableaux. Un tableau est un ensemble de variables regroupées ensemble donc à la limite on peut parser des variables mais formater :s je vois pas ce que ça veut dire.

Je comprends pas très bien votre problème, si vous voulez les ID il vous suffit d'écrire:

echo "$mon_tableau[0]['id']";

et pour les avoir toutes vous mettez dans une boucle où la valeur du premier tableau à 'n' dimension va changer en fonction des 'tours de la boucle.
Est ce que ça réponds à votre question? Parce toute la programmation s'appuie sur la récursivité, on pourrait même dire qu'une variable et une fonction récursive(j'abuse ce n'est pas une fonction juste un emplacement de mémoire, c'est y accéder et la modifier qui est la fonction)

Concrètement ça donnerais:

/*$mon_tableau.length exprime le nombre d' itérations nécessaire, c.a.d le nombre de tours de boucle à faire pour parcourir toutes les cases 'id' du tableau*/

for ($i = 1; $i <= $mon_tableau.length; $i++) {
echo $mon_tableau[$i]['id'];
/* remplacer echo par ce qu'on veut faire au programme de manière non seulement récursive ais aussi (et c'est plus important) répétée, ce qui donne tout un intérêt à la programmation et automatise quand sans programmation on peut faire aussi bien voire mieux mais c'est lourd de faire plusieurs fois une chose idiote , tandis qu'un processeur d'ordinateur se plains pas et que les humains peuvent faire des trucs plus utiles pendant ce temps
*/
}
Messages postés
149
Date d'inscription
samedi 27 juin 2009
Statut
Membre
Dernière intervention
23 juin 2015
33
Salut,

formater, verbe transitif
Sens : Préparer un support qui accueillera des données
https://www.linternaute.fr/dictionnaire/fr/definition/formater/


Un tableau étant un ensemble de données on peu très bien le formater à notre bon vouloir.
Enfin bref ce n'est pas la question.

cela ne résolu aucunement mon problème.
je voudrais créer un tableau qui contiendrais les données comme suis :
Tout d'abord, on met les éléments de niveau 1 dans le nouveau tableau : donc par exemple:
[0] => item1
[1] => item2


Ensuite on rappelle la fonction, et si on tombe sur un élément dont le parent est item 1 l'insérer dans le tableau comme ceci :
[0] => item 1
[1] => __item3
[2] => item2


Mais en gardant les id des éléments si possible (il ne peut pas y en avoir 2 identique étant donnée que ma colonne id est en auto_incremente en bdd)
exemple :
[5] => item 1
[6] => __item3
[2] => item2


Ludo.
Ben si mais tu n'a pas lu ;)
Je ne l'ai pas fait car c'était indiqué comment le faire et que c'est trivial puisque si ce n'est qu'un soucis d'accéder aux données il ne faut pas faire un 2 ème tableau qui multiple les informations qui existent déjà mais savoir comment y accéder. Bref j'allais pas te conseiller quelque chose de mal fait ;)

On crée un nouveau tableau

$tableau2= new array();/

for ($i = 1; $i <= $mon_tableau.length; $i++) {
// echo $mon_tableau[$i]['id'];
// et on remplace le nouvel echo par le tableau doublon
$id_a_inserer=[$mon_tableau[$i]['id'];//ligne pas indispensable mais plus claire
$tableau2[$id_a_inserer]=$mon_item;
// peut être une autre boucle conditionnelle pour définir $mon_item

}

Comme tout ceci est bien compliqué vous devez surtout changer votre façon de raisonner car l'informatique est ffaite pour se simplifier la vie.
A partir de vos requêtes vous pouvez déjà ordonner vos résultats. le pointeur qui vous fournit un tableau peut aussi être orienté.
Si vous utilisez le langage objet vous être en train de vous compliquer les choses et votre structure objet manque d'un élément(peut être un objet parent qui est un simple tableau d'objet, ce qui permettra d'utiliser les méthodes de chaque objets).


Au passage ce n'est pas parce que l'id est auto incrémenté qu'elle est unique mais c'est parce que le champ ID étant IDentifiant il est forcément unique, il peut très bien exister des champs auto-incrémentés non unique et des identifiants qui ne sont pas auto incrémentés ou simplement pas numériques. L'auto incrémentation et l'utilisation d'un champ numérique est une facilité qui se discute(mais là n'est pas le débat).

Une clé primaire(le champ identifiant naturel ou pas) est forcément unique même si plusieurs champs doivent être identifiants(clés étrangères)


En espérant que mon message vous aide. Vous êtes clairement en train de vous perdre et devez simplifier ça ou accéder à vos données sans faire un doublon de tableau des infos que vous avez déjà. Cela passe par changer votre acquisition de données ou votre algorithme ou votre façon d'y accéder puisque vous les avez déjà.

Ceci aussi peut vous donner des explications meilleuress que les miennes:

http://philippe.medan.free.fr/CoursPHP/phpTableauDeuxDim.php
Messages postés
149
Date d'inscription
samedi 27 juin 2009
Statut
Membre
Dernière intervention
23 juin 2015
33
Bonjour mon Le* Père ;)
En effet c'est exactement le résultat recherché !
Même si ce n'est pas très cohérent comme tu le pense, cela va énormément me guider !
je te remercie beaucoup !
Utilisateur anonyme
De rien :)