Operation sur tableau php

Résolu
Bonjour,

Escusez moi pour ce poste long, mais j'ai essayé d'être clair.
La question est à la fin du poste ^^.

A l'aide d'une fonctions, j'ai récupéré dans un tableau les valeurs de mes catégories de ma base de donné.
avec
[0]= ID
[1]=niveau dans ma hiérarchie de catégorie
[2]=Nom

mon tableau ressemble à ça :

Array   
(   
    [0] => Array   
        (   
            [0] => 1   
            [1] => 0   
            [2] => voiture   
        )   

    [1] => Array   
        (   
            [0] => 19   
            [1] => 1   
            [2] => peugeot   
        )   

    [2] => Array   
        (   
            [0] => 20   
            [1] => 2   
            [2] => 206   
        )   

    [3] => Array   
        (   
            [0] => 22   
            [1] => 3   
            [2] => phase1   
        )   

    [4] => Array   
        (   
            [0] => 2   
            [1] => 1   
            [2] => renault   
        )   

    [5] => Array   
        (   
            [0] => 13   
            [1] => 2   
            [2] => clio   
        )   

    [6] => Array   
        (   
            [0] => 16   
            [1] => 3   
            [2] => phase1   
        )


Ensuite je prépose à l'utilisateur de modifier une catégorie (exemple : peugeot) et de l'associer à sa nouvelle catégorie mère.

Or je ne voulais pas pouvoir associer une catégorie à sa propre catégorie en tant que catégorie mère ou à une de ses catégories filles.
En effet il est incohérent d'avoir 206 comme catégorie fille de peugeot et à la fois peugeot comme catégorie fille de 206.

Lorsque l'utilisateur sélectionne la catégorie qu'il veut modifier (toujours notre exemple sur peugeot : je crée un 2e tableau qui me donne les ID que l utilisateur ne DOIT pas pouvoir selectionner, cela me donne :
Array   
(   
    [0] => Array   
        (   
            [0] => 19   
            [1] => 0   
            [2] => peugeot   
        )   

    [1] => Array   
        (   
            [0] => 20   
            [1] => 1   
            [2] => 206   
        )   

    [2] => Array   
        (   
            [0] => 22   
            [1] => 2   
            [2] => phase1   
        )   

)


Ma question j'aimerai crée un 3e tableau qui m'indiquerait les valeur que l utilisateur peut associer à peugeot.

J'ai essaye $tab3 = $tab - $tab2 ;


avec $tab = le tableau complet
et $tab2 = le tableau contenant uniquement les ID interdites

Mais cela ne marche pas.

pour reformuler ce que je voudrais : J'aimerai donc récupérer un tableau qui serait le même que le tableau complet sans les valeur du tableau 2

3 réponses

  1. Bonjour,

    Et un tableau dans un tableau comme ceci:

    $voitures = array(
        'renault' => array(
            'clio',
            'twingo',
        ),
        'peugeot' => array(
            '106',
            '206',
            '306',
        ),
    );
    

    ????

    $marque = $voitures['peugeot'];
    
    foreach($marque AS $key => $modele) {
         echo '<br/>'.$modele;
    }
    

    affiche

    106
    206
    306

    A noter qu'on peut gérer les index de clés comme ceci:

    $voitures = array(
        'renault' => array(
            '1' => 'clio',
            '5' => 'twingo',
        ),
        'peugeot' => array(
            '1' => '106',
            '16' => '206',
            '354' => '306',
        ),
    );
    


    Je sais, c'est pas 'propre' comme des tables en SGBD, mais c'est une idée qui peut dépanner...

    A+

    1. J'ai réussi, j'indique la réponse sur le forum si ça peut aider certain pour d'autres problèmes. a la fin du code de ma fonction j'ai montré un exemple qui déroule l'algo.
      En espérant pouvoir aider quelqu'un =)

      dans mon programme je fais appel à une fonction :

      $tab3=array();
      comparer_tableau($tab, $tab2, $tab3);

      ma fonction est la suivante :

      /*
      Cette fonction recupere
      -tab (constitué de la catégorie que l'on veut modifier + ses catégories filles)
      -tab2 (constitué de toutes les catégories)
      -tab3 initialement vide qui est passé par référence.

      L objectif de la fonction est de récupérer dans tab3 toutes les catégories MOINS ( la catégorie traité et ses catégories filles )

      */

      function comparer_tableau($tab, $tab2, &$tab3) {
      //on parcours le tableau contenant toutes les catégories
      foreach($tab2 as $valeur)
      {
      //on initialise une variable
      $var=0;
      //on parcours le tableau contenant la catégorie traitée + ses filles
      foreach ($tab as $test)
      {
      // on incrémente une variable
      if ($valeur[0] != $test[0])
      $var++;

      //si cette variable est égal à la taille du tableau qui contient la catégorie traitée + ses filles
      //cela veut dire que l'id de la catégorie traité par le foreach de tab2 ne se trouve pas dans le foreach de temp
      //donc on ajoute cette id dans le tab3 qui sera retourné par la fonction.
      if($var==count($tab))
      $tab3[]=array($valeur[0],$valeur[1], $valeur[2]);
      }
      }
      }

      /*
      SCHEMA EXPLCATIF DE LA FONCTION COMPARER_TABLEAU.

      tab2 est de la forme
      [0] = array ( [0] => id categorie
      [1] => niveau de la catégorie (hiérarchie)
      [2] => nom de la catégorie

      tab est de la même forme que tab2 mais ils ne contiennent pas forcément les mêmes informations
      etc...

      Occupons nous uniquement des ID

      1 2 3 4 5 => liste des id de tab2

      2 5 => liste des id de tab

      objectif => avoir un tableau qui contient les ID 1 3 4

      **************1er parcours***********
      on parcours tab 2
      on traite id 1

      on parcours tab
      on traite id3

      1 != 2 => var=1

      on parcours tab
      on traite l'id5

      1!=5 => var=2

      var = taille du tableau tab, donc on écrit la catégorie 1 dans le tableau 3

      *********** 2e parcours **************
      on parcours tab 2
      on traite id 2

      on parcours tab
      on traite id3

      2 = 2 => var=0

      on parcours tab
      on traite l'id5

      2!=5 => var=1

      var est différent de la taille du tableau tab
      donc on n'écrit pas cette catégorie dans le nouveau tableau.
      */