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

Langage PHP Discussion :

[Tableaux] Tableau multi dimensionnel


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut [Tableaux] Tableau multi dimensionnel
    Bonjour,

    Je débute en PHP et j'aimerais créer et remplir un tableau comme par exemple:

    x1 x2 x3 x4
    ------------
    1 1 2 1
    2 2 1 2
    1 2 2 1
    1 1 1 2

    Je connais le nombre de colonnes, par contre le nombre de lignes peut varier.

    Dans un premier temps, comment créer ce tableau?

    Ensuite comment le remplir? J'aimerais pourvoir le remplir par ligne: x1, puis x2, puis x3 et pour finir x4?

    Cette opération doit être faite dans une fonction d'une certaine classe.
    Le tableau doit ensuite être traité dans une fonction d'une autre classe.
    Y'a t-il des précautions à prendre ou des manipulations à faire?

    Merci pour votre aide

  2. #2
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Comme ca par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Matrice {
     
        private $_tab = array();
     
        public function ajouterLigne ($ligne, $x1, $x2, $x3, $x4) {
            $this->_tab[$ligne]['x1'] = $x1;
            $this->_tab[$ligne]['x2'] = $x2;
            $this->_tab[$ligne]['x3'] = $x3;
            $this->_tab[$ligne]['x4'] = $x4;
        }
    }
    L'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mat = new Matrice();
    $mat->ajouterLigne(0, 1, 1, 2, 1);
    Et tu répète pour toutes les lignes avec une boucle for par exemple.

    Cyb.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    pour dire les choses autrement :

    les tableaux 2D ne sont que des tableaux 1D (ou "classiques") pour lesquels chaque élément est un autre tableau 1D.

    Il n'existe donc pas vraiment de notion de "ligne" ou de "colonnes", c'est toi qui donne la signification que tu souhaites aux indices de ton tableau.

    tu dit "Je connais le nombre de colonnes, par contre le nombre de lignes peut varier.", donc il est plus logique que le 1er indice soit celui que tu appelle "ligne", chaque ligne contenant un tableau ayant toujours la meme taille (égale au nombre de colonnes qui est fixe)

    exemple :

    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
    $tab=array();
    $ligne=array(1, 2, 3, 4);
    $tab[0]=$ligne;
    $ligne=array(5, 6, 7, 8);
    $tab[1]=$ligne;
    ...
     
    // ou plus court :
    $tab=array();
    $tab[]=array(1, 2, 3, 4);
    $tab[]=array(5, 6, 7, 8);
    $tab[]=array(9, 10, 11, 12);
     
    // affichage (pour debugger) :
    echo "<table border=1>";
    foreach($tab as $ligne=>$tableau) {
       echo "<tr>";
       foreach($tableau as $colonne=>$element) {
          echo "<td>(LIG=$ligne, COL=$colonne) $element</td>";
       }
       echo "</tr>";
    }
    echo "</table>";

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Ta solution est très intéressante, j'ai juste encore une petite précision a te demander.

    En fait une ligne est ajoutée au tableau à chaque appel d'une certaine fonction (le remplissage se fait dans cette fct).

    Je ne peux pas utiliser une boucle for(), lorsque je rempli une ligne, je ne connais pas encore les données qui iront dans la prochaine ligne!!

    Y'a t-il un moyen de connaitre dans quelle ligne ajoutée les données? En d'autres mots, comment savoir le numéro de la ligne du tableau dans laquelle mettre les données?

    Merci beaucoup

  5. #5
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Vu que c'est toi qui construit ton tableau, tu es le seul à connaitre le numéro de la ligne que tu es en train de calculer !

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Ok merci, mon tableau fonctionne correctement.

    Maintenant j'aimerais copier la 1ère ligne du tableau dans un autre tableau

    Je rapelle qu'une ligne est formée de 4 éléments (2x2 coordonnées X et Y) Par exemple la 1ère ligne pourrait etre: 5 2 6 4 (Coord 1er point: (5,2), coord 2ème point: (6,4)

    Ensuite j'aimerais comparer chaque ligne avec celle copiée dans l'autre tableau
    et copier celle dont 1 coordonnée (X,Y) est identique à celle de la première ligne.

    Voici un exemple:

    5 2 6 4
    3 5 6 8
    2 1 7 3
    6 5 5 2

    La 1ère ligne du tableau représente les coord (5,2) et (6,4). Je copie cette ligne dans un autre tableau.

    Maitenant je cherche une ligne qui contient une même coordonnée que la 1ère ligne. Ici je trouve en 4ème ligne (6,5) et (5,2) => J'ai une coordonnée identique (5,2). Je copie cette ligne dans l'autre tableau.

    Maintenant je recherche une coordonnée identique à (6,5). Qui est la suite la suite de la 4ème ligne, dont j'ai déjà trouvé la coordonnée (5,2).

    Et ainsi de suite, jusqu'à ce que chaque ligne du tableau soit traitée

  7. #7
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    J'ai fais un petit bout de code qui a l'air de bien fonctionner :
    l'appel :
    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
    <?php
    
    require('class.matrice.php');
    
    $mat = new Matrice();
    $mat->ajouterLigne(0, 5, 2, 6, 4);
    $mat->ajouterLigne(1, 3, 5, 6, 8);
    $mat->ajouterLigne(2, 2, 1, 7, 3);
    $mat->ajouterLigne(3, 6, 5, 5, 2);
    $mat->ajouterLigne(4, 9, 1, 2, 2);
    $mat->ajouterLigne(5, 6, 5, 8, 7);
    
    $tabResultat = $mat->trouverCoordonnees();
    
    var_dump($tabResultat);
    ?>

    Et la classe :
    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
    <?php
    
    class Matrice {
    
    &#160;&#160;&#160;&#160;&#160;&#160;private $_tab = array();
    
    &#160;&#160;&#160;&#160;&#160;&#160;private $_iCpt = 0;
    &#160;&#160;&#160;&#160;&#160;&#160;private $_iNbLignes = -1;
    &#160;&#160;&#160;&#160;&#160;&#160;private $_tabChaine = array();
    
    &#160;&#160;&#160;&#160;&#160;&#160;public function ajouterLigne ($ligne, $x1, $x2, $x3, $x4) {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tab&#91;$ligne]&#91;'x1'] = $x1;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tab&#91;$ligne]&#91;'x2'] = $x2;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tab&#91;$ligne]&#91;'x3'] = $x3;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tab&#91;$ligne]&#91;'x4'] = $x4;
    &#160;&#160;&#160;&#160;&#160;&#160;}
    
    
    &#160;&#160;&#160;&#160;&#160;&#160;public function trouverCoordonnees($x1 = 0, $x2 = 0, $x3 = 0, $x4 = 0, $coord_a = true, $coord_b = true) {
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Si le nombre de ligne n'a pas été calculé
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ($this->_iNbLignes == -1) {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_iNbLignes = count($this->_tab);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Si il y a qu'une ligne, on sort !
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ($this->_iNbLignes == 1) {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Si pour la premiere ligne
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (count($this->_tabChaine) == 0) {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;] = $this->_tab&#91;0];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_iCpt++;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->trouverCoordonnees(&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;0]&#91;'x1'],
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;0]&#91;'x2'],
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;0]&#91;'x3'],
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;0]&#91;'x4']);
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return $this->_tabChaine;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Pour toutes les lignes du tableau original
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for ( ; $this->_iCpt < $this->_iNbLignes ; $this->_iCpt++) {
    
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Pour la premiere coordonnée
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ((($coord_a === true) && ($this->_tab&#91;$this->_iCpt]&#91;'x1'] == $x1) && ($this->_tab&#91;$this->_iCpt]&#91;'x2'] == $x2))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;||
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(($coord_b === true) && ($this->_tab&#91;$this->_iCpt]&#91;'x1'] == $x3) && ($this->_tab&#91;$this->_iCpt]&#91;'x2'] == $x4))) {
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// On copie
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;] = $this->_tab&#91;$this->_iCpt];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$a = $this->_tab&#91;$this->_iCpt]&#91;'x3'];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$b = $this->_tab&#91;$this->_iCpt]&#91;'x4'];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_iCpt++;
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// On recherche l'autre coordonnée
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->trouverCoordonnees(0, 0, $a, $b, false, true);
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// Pour la seconde
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;elseif ((($coord_a === true) && ($this->_tab&#91;$this->_iCpt]&#91;'x3'] == $x1) && ($this->_tab&#91;$this->_iCpt]&#91;'x4'] == $x2))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;||
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(($coord_b === true) && ($this->_tab&#91;$this->_iCpt]&#91;'x3'] == $x3) && ($this->_tab&#91;$this->_iCpt]&#91;'x4'] == $x4))) {
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// On copie
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_tabChaine&#91;] = $this->_tab&#91;$this->_iCpt];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$a = $this->_tab&#91;$this->_iCpt]&#91;'x1'];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$b = $this->_tab&#91;$this->_iCpt]&#91;'x2'];
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->_iCpt++;
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// On recherche l'autre coordonnée
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->trouverCoordonnees($a, $b, 0, 0, true, false);
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    
    &#160;&#160;&#160;&#160;&#160;&#160;}
    }
    
    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Merci beaucoup

    Ton code à l'air sympa, je vais essayer

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 09/07/2008, 12h41
  2. Réponses: 5
    Dernier message: 13/02/2008, 17h52
  3. [Tableaux] Trier un tableau multi-dimensionnel associatif
    Par Oprichnik dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2007, 23h16
  4. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  5. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23

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