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 :

PHP MYSQL / Affichage date dans un tableau


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 3
    Points
    3
    Par défaut PHP MYSQL / Affichage date dans un tableau
    Bonsoir à tous,

    Nom : poulet.jpg
Affichages : 3784
Taille : 296,5 Ko

    Voici l'affichage web d'une requête.

    Je voudrai savoir si il possible de n'afficher qu'une seule fois la date lorsque celle-ci est la même (exemple : une seule fois Mercredi 15/08/18 avec les deux enregistrements)

    Voici la requête actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = $bdd->query("SELECT  id, jour, jour2, mois, annee, produit, DATE_FORMAT(dlc, '%d/%m/%Y') AS dlc, lot, quantite, casse, heure_debut, heure_fin, temperature, controle_poids FROM poulet WHERE id='$test' ORDER BY `poulet`.`annee`DESC,`poulet`.`mois`DESC,`poulet`.`jour2`DESC,`poulet`.`date`DESC");
    Sachant que j'ai bien une colonne 'date' dans la table 'Poulet' de type 'timestamp' mais qui ne me sert quasiment pas.
    Les colonnes 'Année', 'mois', 'jour' et 'jour2' s'alimentent automatiquement dans la BDD dès lorsque je saisie une nouvelle entrée

    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    montrez nous le code qui génère le tableau.

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Avec MySQL non. Par contre quand tu affiches les données il suffit d’utiliser une variable de travail initialisée à "" par exemple avant la boucle d’affichage. Dans la boucle si sa valeur est différente de celle de la table tu sauvegardes la nouvelle valeur dans la variable de travail et tu affiches la date. Sinon tu mets la date à afficher à "".
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  4. #4
    Candidat au Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour, 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
    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
    <table width="70%" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#000000">
      <tbody>
        <tr>
          <td bgcolor="#BBBBBB" style="text-align: center;"><h5>Date de saisie</h5></td>
          <td width="73" bgcolor="#BBBBBB" style="text-align: center">&nbsp;</td>
          <td width="73" bgcolor="#BBBBBB" style="text-align: center"><h5>produit</h5></td>
          <td width="93" bgcolor="#BBBBBB" style="text-align: center"><h5>Quantité</h5></td>
          <td width="62" bgcolor="#BBBBBB" style="text-align: center"><h5>Casse<br>
            <span style="font-size: 9px">Après 6h<br>
            </span><span style="font-size: 9px"> de mise <br>
            en vente</span></h5></td>
          <td width="62" bgcolor="#BBBBBB" style="text-align: center"><h5>Vente</h5></td>
          <td width="65" bgcolor="#BBBBBB" style="text-align: center"><h5>Editer</h5></td>
          <td width="65" bgcolor="#BBBBBB" style="text-align: center"><h5>Détail</h5></td>
          </tr>
        <?php // On affiche chaque entrée une à une
    while ($donnees = $reponse->fetch())
     
    {
    ?>
        <tr>
    <td width="145" valign="middle" bgcolor="#F0F0F0" style="font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'DejaVu Sans', Verdana, sans-serif;"><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tbody>
          <tr>
            <td width="50%" style="text-align: right"><a href="produit_poulet_jour.php?product=<?php echo $donnees[jour]; ?>"><?php echo $donnees[jour]; ?></a>&nbsp;</td>
            <td width="50%" style="text-align: center"><?php echo $donnees[jour2]; ?>/<?php echo $donnees[mois]; ?>/<?php echo $donnees[annee]; ?></td>
            </tr>
        </tbody>
    </table></td>
    <td bgcolor="#FFFFFF" style="text-align: center"><?php
    $talon2 = $donnees[produit];
     $talon = "Talon de Jambeau";
     
    if ($talon2 == $talon)
    {
    echo '<img src="../talon.png" width="100" >';
     
    ?><?php  }
    ?>
     
    <?php
    $cuisse2 = $donnees[produit];
     $cuisse = "Cuisse de Poulet";
     
    if ($cuisse2 == $cuisse)
    {
    echo '<img src="../cuisses.jpeg" width="100" >';
     
    ?><?php  }
    ?>
     
    <?php
    $jambonneau2 = $donnees[produit];
     $jambonneau = "Jambonneau Nature";
     
    if ($jambonneau2 == $jambonneau)
    {
    echo '<img src="../jambonneau.jpg" width="100" >';
     
    ?><?php  }
    ?>
     
    <?php
    $fermier2 = $donnees[produit];
     $fermier = "Poulet Fermier";
     
    if ($fermier2 == $fermier)
    {
    echo '<img src="../poulet fermier.jpeg" width="100" >';
     
    ?><?php  }
    ?>
     
    <?php
    $dorees2 = $donnees[produit];
     $dorees = "Pomme de Terre Dorées";
     
    if ($dorees2 == $dorees)
    {
    echo '<img src="../dorees.jpeg" width="100" >';
     
    ?><?php  }
    ?>
     
    <?php
    $ailes2 = $donnees[produit];
     $ailes = "Ailes de Poulet";
     
    if ($ailes2 == $ailes)
    {
    echo '<img src="../ailes.jpeg" width="100" >';
     
    ?><?php  }
    ?><?php
    $poulet2 = $donnees[produit];
     $poulet = "Poulet Standard";
     
    if ($poulet2 == $poulet)
    {
    echo '<img src="../Unknown-3.jpeg" width="100" >';
     
    ?>
      <?php  }
    ?><?php
    $grenaille2 = $donnees[produit];
     $grenaille = "Pomme de Terre Grenaille";
     
    if ($grenaille2 == $grenaille)
    {
    echo '<img src="../grenaille.jpeg" width="100" >';
     
    ?>
      <?php  }
    ?><?php
    $mexicaine2 = $donnees[produit];
     $mexicaine = "Pomme de Terre Mexicaine";
     
    if ($mexicaine2 == $mexicaine)
    {
    echo '<img src="../mexicaine.jpeg" width="100" >';
     
    ?>
      <?php  }
    ?><?php
    $wedge2 = $donnees[produit];
     $wedge = "Pomme de Terre Wedges";
     
    if ($wedge2 == $wedge)
    {
    echo '<img src="../wedge.jpg" width="100" >';
     
    ?>
      <?php  }
    ?></td>
          <td bgcolor="#F0F0F0" style="text-align: center"><a href="produit_select.php?product=<?php echo $donnees[produit]; ?>"><?php echo $donnees[produit]; ?></a></td>
          <td bgcolor="#F0F0F0" style="text-align: center"><?php echo $donnees['quantite']; ?></td>
          <td bgcolor="#F0F0F0" style="text-align: center"><?php echo $donnees['casse']; ?></td>
          <td bgcolor="#F0F0F0" style="text-align: center"><?php echo $donnees['quantite']-$donnees['casse']; ?></td>
        <td bgcolor="#F0F0F0" style="text-align: center"><p><a href="modifier_cuisson.php?product=<?php echo $donnees[id]; ?>"><img src="../editer.png" width="25" height="25" alt=""/></a></p></td>
        <td bgcolor="#F0F0F0" style="text-align: center"><p><a href="voir_cuisson.php?product=<?php echo $donnees[id]; ?>" target="_blank"><img src="../detail.jpg" width="25" height="25" alt=""/></a></p></td>
        <?php
    }
     
    $reponse->closeCursor(); // Termine le traitement de la requête
     
    ?>    </tr>
      </tbody>
    </table>
    D'avance merci

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Avant ta boucle tu initialise une variable
    Au tout début de ta boucle tu ajoute une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dateCourante = $donnees['jour2'].'/'.$donnees['mois'].'/'.$donnees['annee'];
    Au moment d'afficher la date tu vérifies si $dateCourante est différente de $datePrecedenteSi c'est le cas tu affiches [CODEINLINE]$dateCourante[/CODE]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if($dateCourante != $datePrecedente)
        echo $dateCourante;
    A la fin de ta boucle tu assigne $datePrecedente à $dateCourante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $datePrecedente = $datePrecedente;
    Attention à ton utilisation des indices de tableau. En l'état ton code doit être plein de warnings :
    doit s'écrire
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Tu peux t'inspirer de ça.

    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
     
        <?php // On affiche chaque entrée une à une
    $savdate = "";
    while ($donnees = $reponse->fetch())
     
    {
     $curdate = $donnees['jour2'].'/'.$donnees['mois'].'/'.$donnees['annee'];
     $jour    = "";
     if ($savdate != $curdate)
     {
      $savdate = $curdate;
      $jour    = $curdate;
     }
     ?>
        <tr>
    <td width="145" valign="middle" bgcolor="#F0F0F0" style="font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'DejaVu Sans', Verdana, sans-serif;"><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tbody>
          <tr>
            <td width="50%" style="text-align: right"><a href="produit_poulet_jour.php?product=<?php echo $donnees[jour]; ?>"><?php echo $donnees[jour]; ?></a>&nbsp;</td>
            <td width="50%" style="text-align: center"><?php echo $jour; ?></td>

    Nom : Capture20180816_001.JPG
Affichages : 1930
Taille : 84,2 Ko

    Quelques conseils :
    Quand tu écris $donnees[mois] il faut mettre des apostrophes aux chaînes de caractères => $donnees['mois']

    Pour afficher une image tu as une série de if qui alourdissent l'écriture du programme et donc sa maintenabilité. A défaut d'une structure généralisable, tu peux faire comme suit.

    Tu crées un tableau avec types de produits. Type de produit donne image . En guise d'exemple, je n'en ai mis que 3.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $arrayImg = array('Talon de Jambeau' => '../talon.png','Cuisse de Poulet' => '../cuisses.jpeg', 'Jambonneau Nature' => '../jambonneau.jpg');

    Puis ce code là te remplace au moins 100 lignes !!!
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <td bgcolor="#FFFFFF" style="text-align: center"><?php
    if (isset($arrayImg[$donnees['produit']]))
    {
     echo '<img src="'.$donnees['produit'].'" width="100" >';
    }?>
    </td>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- ton code HTML pour la <table> m'a fait saigner des yeux....
    • attributs obsolètes (valign, bgcolor,...)
    • une <table> dans un <td>
    • pas de <thead>, ni de <th>,...

    A LIRE absolument :


    2- @grunk & badaze
    Aucun de vous n'a proposé la fusion des cellules !
    Il faut bien dire que c'est là la principale difficulté, puisqu'il faut connaitre le nombre de ligne concernées (pour chaque date) pour pouvoir écrire
    sur la 1ère ligne :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tr>
       <td rowspan="...??...">(la date)</td>
       <td>autre donnée</td>
       <td>autre donnée</td>
    </tr>
    et sur les suivantes (avec la même date) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tr>
       <!-- (RIEN ici) -->
       <td>autre donnée</td>
       <td>autre donnée</td>
    </tr>
    Perso, je passerais par la création d'un array intermédiaire, où on stocke, pour chaque date, le nombre d’occurrences.

    3-
    Citation Envoyé par badaze Voir le message
    ...Pour afficher une image tu as une série de if qui alourdissent l'écriture du programme et donc sa maintenabilité...
    La meilleur solution est quand même d'enregistrer les URL des images dans la bdd, pour chaque produit !
    Dernière modification par Invité ; 17/08/2018 à 13h44.

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 502
    Points : 770
    Points
    770
    Par défaut
    Bonjour, fait un Group By sur le champ date et fusionner les lignes qui ont la même date.

    Cordialement.

  9. #9
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Bonjour...

    Sur ce sujet, j'avais fait ça une fois... ça marchait. Fonction row_spanise

    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
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline'),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie'),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie'),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé'),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat'),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise'),
    6 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus'),
    7 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma'),
    8 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore'),
    9 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline'),
    10 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev'),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Lolo'),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Momo'),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Nénesse'),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Otto'),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat'),
    16 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat'),
    17 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania'),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene'),
    19 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia'),
    20 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo'),
    21 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco'),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba'),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Xenia'),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam'),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda')
    );
    //si second argument absent, alors on row_spanise tous les champs sauf le dernier
    //si présent, on row_spanise les n premières colonnes
    function row_spanise(array $data, $how_many=NULL){
    	if(count($data)>0){
    		$keys=array_keys($data[0]);
    		//soit how_many est correct soit on en tient pas compte
    		if(isset($how_many) && is_int($how_many) && $how_many < count($data)){
    			$combien=$how_many;
    		}
    		else{
    			$combien=count($data)-1;
    		}
     
    		if($combien >= 1){
    			$temoins=array();
    			for($i=0;$i<$combien;$i++){
    				$temoins[$i]=$keys[$i];
    			}
    			//on initialise repart_rowspans à zéro
    			$repart_rowspans = array();
    			$i=0;
    			foreach($data as $row){
    				foreach($temoins as $temoin){
    					$repart_rowspans[$i][$temoin]=0;
    				}
    				$i++;
    			}
    			//on initialise cur_temoins
    			$cur_temoins=array();
    			$i=0;
    			foreach($temoins as $temoin){
    				$cur_temoins[$i]['key']= $temoin;
    				$cur_temoins[$i]['value']='';
    				$i++;
    			}
    			//on traite
    			$row_count=0;
    			$changes=array();
    			for($i=0;$i<count($temoins);$i++){
    				$changes[$i]=0;
    			}
     
    			do{
    				for($changement=0;$changement<count($temoins);$changement++){
    					if($data[$row_count][$temoins[$changement]] != $cur_temoins[$changement]['value']){
    						break;
    					}
    				}
    				//champ qui ne change pas
    				for($i=0;$i<$changement;$i++){
    					//incrémentation de la cellule du dernier changement
    					$repart_rowspans[$changes[$i]][$temoins[$i]]++;
    					//non affichage de la cellule courante
    					$repart_rowspans[($row_count)][$temoins[$i]]=0;
    				}
    				//champ qui change
    				for($i=$changement;$i<count($temoins);$i++){
    					//affichage de la cellule courante
    					$repart_rowspans[($row_count)][$temoins[$i]]=1;
    					//retenir la ligne du dernier changement
    					$changes[$i]=$row_count;
    					$cur_temoins[$i]['value']=$data[$row_count][$temoins[$i]];
    				}
    				$row_count++;
    			}while($row_count<count($data));
    			if(count($repart_rowspans)>0){
    				return $repart_rowspans;
    			}
    			else{
    				return false;
    			}
    		}
    		else{
    			return false;
    		}
    	}
    	else{
    		return false;
    	}
    }
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<meta charset="utf-8">
    		<title>rowspan</title>
    		<style>
    		table {
    		 border-collapse:collapse;
    		 width:90%;
    		 }
    		table tr:nth-child(2n) td:last-child {
    			background-color: palegreen;
    		}
    		th, td {
    		 border:1px solid black;
    		 width:20%;
    		 }
    		 th{
    			background-color: limegreen;
    		  }
    		td {
    		 text-align:center;
    		 }
     
    		caption {
    		 font-weight:bold
    		 }
    		 </style>
    	</head>
    	<body>
    		<?php 
    		$nb_colonnes_rowspan=2;
    		$rowspans=row_spanise($contacts,$nb_colonnes_rowspan);
    		if($rowspans!==false){
    			$keys=array_keys($contacts[0]);
    			$temoins=array_keys($rowspans[0]);
    		}
    		?>
    		<table>
    			<caption>Tableau AVEC rowspan</caption>
    			<thead>
    				<tr>
    				<?php
    				foreach($keys as $key){
    					echo '<th>'.ucfirst($key).'</th>';
    				}
    				?>
    				</tr>
    			</thead>
    			<tbody>
    			<?php
    			$i=0;
    			do{
    				echo '<tr>';
    				foreach($keys as $key){
    					if(in_array($key,$temoins)){
    						if($rowspans[$i][$key]>1){
    							echo '<td rowspan="'.$rowspans[$i][$key].'">'.$contacts[$i][$key].'</td>';
    						}
    						elseif($rowspans[$i][$key]==1){
    							echo '<td>'.$contacts[$i][$key].'</td>';
    						}
    					}
    					else{
    						echo '<td>'.$contacts[$i][$key].'</td>';
    					}
    				}
    				echo '</tr>'."\n";
    				$i++;
    			}while($i<count($contacts));
    			?>
    			</tbody>
    		</table>
    		<br/><br/>
    	</body>
    </html>
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Ma version.

    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
    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
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline'),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie'),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie'),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé'),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat'),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise'),
    6 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus'),
    7 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma'),
    8 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore'),
    9 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline'),
    10 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev'),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Lolo'),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Momo'),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Nénesse'),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Otto'),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat'),
    16 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat'),
    17 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania'),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene'),
    19 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia'),
    20 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo'),
    21 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco'),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba'),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Xenia'),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam'),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda')
    );function pre_spanize($contacts) {
     $result = array();
     foreach($contacts as $subArray) {
      $length = count($subArray);
      for($i=1;$i<$length;$i++) {
       $jsonView = json_encode(array_slice($subArray, 0, $i));
       if (!isset($result[$jsonView])) $result[$jsonView] = 1; else $result[$jsonView]++;    
      }
     } 
     return $result;
    }
    $scan = pre_spanize($contacts);
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     <head>
      <meta charset="utf-8">
      <title>rowspan</title>
      <style>
      table {
       border-collapse:collapse;
       width:90%;
       }
      table tr:nth-child(2n) td:last-child {
       background-color: palegreen;
      }
      th, td {
       border:1px solid black;
       width:20%;
       }
       th{
       background-color: limegreen;
        }
      td {
       text-align:center;
       }
     
      caption {
       font-weight:bold
       }
       </style>
     </head>
     <body>
      <table>
       <caption>Tableau AVEC rowspan bis</caption>
       <thead>
        <tr>
        <?php
        reset($contacts);
        $keys = next($contacts);
        foreach($keys as $key => $value){
         echo '<th>'.ucfirst($key).'</th>';
        }
        ?>
        </tr>
       </thead>
       <tbody><?php
        $deleted = array();
        foreach($contacts as $subArray) {
         print "<tr>";
         $length = count($subArray);
         for($i=0;$i<$length;$i++) {
          $jsonView = json_encode(array_slice($subArray, 0, ($i+1)));
          $rowSpan  = "";
          if (isset($scan[$jsonView])) if ($scan[$jsonView] > 1) $rowSpan = 'rowSpan="'.$scan[$jsonView].'"';
          if (!isset($deleted[$jsonView])) {
           $output = implode('|',array_slice($subArray, $i, 1));
           print "<td $rowSpan>".$output."</td>";       
          }
          if (isset($scan[$jsonView])) $deleted[$jsonView] = $scan[$jsonView];
             unset($scan[$jsonView]);
         }
         print "</tr>";
        }?>
       </tbody>
      </table>
      <br/><br/>
     </body>
    </html>

    Nom : Capture20180818_001.JPG
Affichages : 1871
Taille : 118,9 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  11. #11
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    @badaze
    3-
    La meilleur solution est quand même d'enregistrer les URL des images dans la bdd, pour chaque produit !
    Tout à fait. C'est bien pour cela que j'ai écrit "A défaut d'une structure généralisable". Je dirais même mieux il faut aussi travailler avec une table des articles qui contiendrait à minima un code une description et l'url de l'image.
    Car comme c'est fait actuellement c'est ingérable à moyen et long terme. Il suffit de voir le code actuel où tout ajout de produit se traduit par une modification du code.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #12
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Une version plus aboutie qui prépare les données dans un tableau (array) qu'on peut ensuite exploiter.

    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
    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
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline'),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie'),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie'),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé'),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat'),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise'),
    6 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus'),
    7 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma'),
    8 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore'),
    9 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline'),
    10 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev'),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Lolo'),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Momo'),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Nénesse'),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Otto'),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat'),
    16 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat'),
    17 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania'),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene'),
    19 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia'),
    20 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo'),
    21 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco'),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba'),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Xenia'),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam'),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda')
    );function prepare_span_table($contacts) {
     $result = array();
     $temp   = array();
     $length = 0;
     foreach($contacts as $subArray) {
      $length = count($subArray);
      for($i=1;$i<=$length;$i++) {
       $key = implode(chr(29),array_slice($subArray, 0, $i));
       if (!isset($temp[$key])) $temp[$key] = 1; else $temp[$key]++;    
      }
     } 
     $deleted = array();
     $index   = -1;
     foreach($contacts as $subArray) {
      $index++;
      for($i=0;$i<$length;$i++) {
       $key = implode(chr(29), array_slice($subArray, 0, ($i+1)));
       $rowSpan  = 0;
       if (isset($temp[$key])) if ($temp[$key] > 1) $rowSpan = $temp[$key];
       if (!isset($deleted[$key])) {
        $output = implode('|',array_slice($subArray, $i, 1));
        $result[$index][$output] = $rowSpan;
       }
       if (isset($temp[$key])) $deleted[$key] = $temp[$key];
          unset($temp[$key]);
      }
     }
     return $result;
    }
    $scan = prepare_span_table($contacts);
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     <head>
      <meta charset="utf-8">
      <title>prepare_span_table</title>
      <style>
      table {
       border-collapse:collapse;
       width:90%;
       }
      table tr:nth-child(2n) td:last-child {
       background-color: palegreen;
      }
      th, td {
       border:1px solid black;
       width:20%;
       }
       th{
       background-color: limegreen;
        }
      td {
       text-align:center;
       }
     
      caption {
       font-weight:bold
       }
       </style>
     </head>
     <body>
      <table>
       <caption>Tableau AVEC prepare_span_table</caption>
       <thead>
        <tr>
        <?php
        reset($contacts);
        $keys = next($contacts);
        foreach($keys as $key => $value){
         echo '<th>'.ucfirst($key).'</th>';
        }
        ?>
        </tr>
       </thead>
       <tbody><?php
        foreach($scan as $subArray) {
         print "<tr>";
         foreach($subArray as $tdValue => $rowSpan) {
          print "<td ".($rowSpan != 0 ? "rowspan=\"$rowSpan\" " : " ").">$tdValue</td>";
         }
         print "</tr>";
        }?>
       </tbody>
      </table>
      <br/><br/>
     </body>
    </html>


    Nom : Capture20180818_005.JPG
Affichages : 1901
Taille : 120,3 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  13. #13
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci beaucoup Badaze...
    Je vais étudier et adopter ton code.
    et d'abord étudier 2 syntaxes que je ne connais pas : reset et next...
    Merci encore ! Tes codes sont toujours élégants.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    @badaze
    OK, ici ça fonctionne... dans ce cas.

    MAIS Je me permet de soulever un lièvre... :

    (par exemple) si on a une colonne "statut", qui peut prendre comme valeurs "membre", "admin", "super-admin",...
    On est d'accord que ces valeurs ne vont pas se suivre "logiquement".
    (on peut avoir "membre" "membre" "membre" "admin" "membre" "super-admin" "membre" "membre"...)

    ALORS LA, ça met le bazar :
    • des cellules qui fusionnent là où on ne leur demande rien,
    • la structure même de la <table> qui fout le camp...

    (pour vous en convaincre, mettez plusieurs "Aline", "Gus" ou "Isidore" dans l'array (sans qu'ils se suivent forcément).)

    DU COUP :
    • il faudrait préciser sur QUELLES colonnes appliquer la méthode (ici : uniquement "pays" et "ville").
    • détecter et séparer les répétitions successives.
    Dernière modification par Invité ; 19/08/2018 à 10h35.

  15. #15
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @jreaux62

    Il suffit de changer for($i=1;$i<=$length;$i++) { en for($i=1;$i<$length;$i++) { dans la fonction. De cette manière la dernière colonne n'est pas prise en compte.
    Après il faut (sûrement) que les données soient triées.

    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
    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
     
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline'),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline'),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie'),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie'),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie'),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé'),
    6 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat'),
    7 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise'),
    8 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus'),
    9 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma'),
    10 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore'),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline'),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev'),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Lolo'),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Momo'),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Nénesse'),
    16 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Otto'),
    17 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat'),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat'),
    19 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania'),
    20 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene'),
    21 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia'),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo'),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco'),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba'),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Xenia'),
    26 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam'),
    27 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam'),
    28 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda')
    );
    function prepare_span_table($contacts) {
     $result = array();
     $temp   = array();
     $length = 0;
     foreach($contacts as $subArray) {
      $length = count($subArray);
      for($i=1;$i<$length;$i++) {
       $key = implode(chr(29),array_slice($subArray, 0, $i));
       if (!isset($temp[$key])) $temp[$key] = 1; else $temp[$key]++;    
      }
     } 
     $deleted = array();
     $index   = -1;
     foreach($contacts as $subArray) {
      $index++;
      for($i=0;$i<$length;$i++) {
       $key = implode(chr(29), array_slice($subArray, 0, ($i+1)));
       $rowSpan  = 0;
       if (isset($temp[$key])) if ($temp[$key] > 1) $rowSpan = $temp[$key];
       if (!isset($deleted[$key])) {
        $output = implode('|',array_slice($subArray, $i, 1));
        $result[$index][$output] = $rowSpan;
       }
       if (isset($temp[$key])) $deleted[$key] = $temp[$key];
          unset($temp[$key]);
      }
     }
     return $result;
    }
    $scan = prepare_span_table($contacts);
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     <head>
      <meta charset="utf-8">
      <title>prepare_span_table</title>
      <style>
      table {
       border-collapse:collapse;
       width:90%;
       }
      table tr:nth-child(2n) td:last-child {
       background-color: palegreen;
      }
      th, td {
       border:1px solid black;
       width:20%;
       }
       th{
       background-color: limegreen;
        }
      td {
       text-align:center;
       }
     
      caption {
       font-weight:bold
       }
       </style>
     </head>
     <body>
      <table>
       <caption>Tableau AVEC prepare_span_table</caption>
       <thead>
        <tr>
        <?php
        reset($contacts);
        $keys = next($contacts);
        foreach($keys as $key => $value){
         echo '<th>'.ucfirst($key).'</th>';
        }
        ?>
        </tr>
       </thead>
       <tbody><?php
        foreach($scan as $subArray) {
         print "<tr>";
         foreach($subArray as $tdValue => $rowSpan) {
          print "<td ".($rowSpan != 0 ? "rowspan=\"$rowSpan\" " : " ").">$tdValue</td>";
         }
         print "</tr>";
        }?>
       </tbody>
      </table>
      <br/><br/>
     </body>
    </html>

    Nom : Capture20180818_006.JPG
Affichages : 1968
Taille : 128,9 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par badaze Voir le message
    ...De cette manière la dernière colonne n'est pas prise en compte...
    Ca, c'est un emplâtre sur une jambe de bois !

    • Ajoute une 4ème, une 5ème colonnes...
    • Ajoute un "Aline" ailleurs...
    • D'autant que l'idée est de fusionner AUSSI les 2 "Aline", les "..."


    De mon coté, j'essaie des trucs depuis un bon moment, mais rien ne sort...
    Je vais avoir besoin d'un papier et d'un crayon, et... de l'aspirine...

  17. #17
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @jreaux62
    Je ne suis pas d'accord. Je ne me base pas sur un poste du tableau mais sur un ensemble de postes. Ce qui fait que le tableau peut avoir plus que 3 colonnes.
    De plus faut un minimum d'organisation dans les données ne serait-ce que tous les "enregistrements" aient le même nombre de valeurs.

    Voici un exemple avec 4 colonnes et une ville répétée avec un autre pays.

    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
    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
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline','extra'=>1),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline','extra'=>2),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie','extra'=>1),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie','extra'=>1),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie','extra'=>2),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé','extra'=>1),
    6 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat','extra'=>1),
    7 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise','extra'=>1),
    8 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus','extra'=>1),
    9 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma','extra'=>1),
    10 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore','extra'=>1),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline','extra'=>1),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev','extra'=>1),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Lolo','extra'=>1),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Momo','extra'=>1),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Nénesse','extra'=>1),
    16 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Otto','extra'=>1),
    17 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat','extra'=>1),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat','extra'=>1),
    19 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania','extra'=>1),
    20 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene','extra'=>1),
    21 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia','extra'=>1),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo','extra'=>1),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco','extra'=>1),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba','extra'=>1),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Xenia','extra'=>1),
    26 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam','extra'=>1),
    27 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam','extra'=>2),
    28 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda','extra'=>1),
    29 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Jacqueline','extra'=>1),
    30 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Kev','extra'=>1),
    31 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Lolo','extra'=>1),
    32 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Momo','extra'=>1)
    );function prepare_span_table($contacts) {
     $result = array();
     $temp   = array();
     $length = 0;
     foreach($contacts as $subArray) {
      $length = count($subArray);
      for($i=1;$i<$length;$i++) {
       $key = implode(chr(29),array_slice($subArray, 0, $i));
       if (!isset($temp[$key])) $temp[$key] = 1; else $temp[$key]++;    
      }
     } 
     $deleted = array();
     $index   = -1;
     foreach($contacts as $subArray) {
      $index++;
      for($i=0;$i<$length;$i++) {
       $key = implode(chr(29), array_slice($subArray, 0, ($i+1)));
       $rowSpan  = 0;
       if (isset($temp[$key])) if ($temp[$key] > 1) $rowSpan = $temp[$key];
       if (!isset($deleted[$key])) {
        $output = implode('|',array_slice($subArray, $i, 1));
        $result[$index][$output] = $rowSpan;
       }
       if (isset($temp[$key])) $deleted[$key] = $temp[$key];
          unset($temp[$key]);
      }
     }
     return $result;
    }
    $scan = prepare_span_table($contacts);
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     <head>
      <meta charset="utf-8">
      <title>prepare_span_table</title>
      <style>
      table {
       border-collapse:collapse;
       width:90%;
       }
      table tr:nth-child(2n) td:last-child {
       background-color: palegreen;
      }
      th, td {
       border:1px solid black;
       width:20%;
       }
       th{
       background-color: limegreen;
        }
      td {
       text-align:center;
       }
     
      caption {
       font-weight:bold
       }
       </style>
     </head>
     <body>
      <table>
       <caption>Tableau AVEC prepare_span_table</caption>
       <thead>
        <tr>
        <?php
        reset($contacts);
        $keys = next($contacts);
        foreach($keys as $key => $value){
         echo '<th>'.ucfirst($key).'</th>';
        }
        ?>
        </tr>
       </thead>
       <tbody><?php
        foreach($scan as $subArray) {
         print "<tr>";
         foreach($subArray as $tdValue => $rowSpan) {
          print "<td ".($rowSpan != 0 ? "rowspan=\"$rowSpan\" " : " ").">$tdValue</td>";
         }
         print "</tr>";
        }?>
       </tbody>
      </table>
      <br/><br/>
     </body>
    </html>

    Nom : Capture20180818_007.JPG
Affichages : 1849
Taille : 139,2 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #18
    Invité
    Invité(e)
    Par défaut
    OK.

    1- si on EXCLUT la dernière colonne, ça fonctionne bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for($i=1;$i<$length;$i++) {
    2- si on INCLUT la dernière colonne, alors ça NE fonctionne PLUS : la table part en vrille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for($i=1;$i<=$length;$i++) {
    Une explication ?


    TESTE avec cet array :
    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
    <?php
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline','extra'=>1),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'login' => 'Aline','extra'=>2),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Bernie','extra'=>1),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie','extra'=>1),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Charlie','extra'=>2),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Dédé','extra'=>1),
    6 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Esat','extra'=>1),
    7 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'login' => 'Framboise','extra'=>1),
    8 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Gus','extra'=>1),
    9 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'login' => 'Helma','extra'=>1),
    10 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'login' => 'Isidore','extra'=>1),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Jacqueline','extra'=>1),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Kev','extra'=>1),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Aline','extra'=>1),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Aline','extra'=>1),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Aline','extra'=>1),
    16 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Aline','extra'=>1),
    17 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'login' => 'Pat','extra'=>1),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Quat','extra'=>1),
    19 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Rania','extra'=>1),
    20 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'login' => 'Sembene','extra'=>1),
    21 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'login' => 'Tia','extra'=>1),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Ugo','extra'=>1),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Vasco','extra'=>1),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Wemba','extra'=>1),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam','extra'=>1),
    26 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam','extra'=>1),
    27 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Yam','extra'=>2),
    28 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'login' => 'Zelda','extra'=>1),
    29 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Jacqueline','extra'=>1),
    30 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Yam','extra'=>1),
    31 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Yam','extra'=>1),
    32 => array('pays' => 'USA', 'ville' => 'PARIS', 'login' => 'Momo','extra'=>1)
    );
    Dernière modification par Invité ; 19/08/2018 à 10h13.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'en ai rêvé cette nuit !
    Tout m'est apparu clairement...

    Voici donc mon code :

    1- table - création d un array des rowspan (nombre de cellules A FUSIONNER) pour un array
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // 1- table - création d un array des rowspan (nombre de cellules A FUSIONNER) pour un array
    function table_get_rowspan_from_rowAll( $rowAll, $colsToFuse=NULL ) 
    {
    	// $colsToFuse : array des colonnes à prendre en compte pour les fusions de cellules 
    	// $colsToFuse = NULL : AUCUNE colonne (par défaut)
    	// $colsToFuse = [] : TOUTES les colonnes
     
    	$rowSpan 	= [];	// table des rowspan
    	if( !empty($rowAll) )
    	{
    		$keyR 		= []; 	// index de référence (par colonne)
    		$valR 		= []; 	// valeur de référence (par colonne)
    		// pour chaque rangée
    		foreach( $rowAll as $key => $row )
    		{
    			// pour chaque colonne
    			foreach( $row as $col => $val )
    			{
    				// 1- soit TOUTES les colonnes
    				// 2- soit uniquement celles choisies ($colsToFuse)
    				//    dans ce 2ème cas, pour les colonnes NON choisies, $rowSpan[$key][$col] NE sera PAS défini (important)
    				if( is_array($colsToFuse) && (empty($colsToFuse) || in_array($col, $colsToFuse)) )
    				{
    					// on initialise les références
    					if( !isset($keyR[$col]) ){	$keyR[$col] = $key; }
    					if( !isset($valR[$col]) ){	$valR[$col] = $val; }
     
    					// on affecte 1 à la cellule (par défaut)
    					$rowSpan[$key][$col] = 1;
     
    					// si la valeur est identiques à celle de référence
    					if( $valR[$col] == $val )
    					{
    						$rowSpan[$key][$col] = 0;	// on affecte 0 à la cellule (elle NE sera PAS affichée)
    						$rowSpan[$keyR[$col]][$col]++;	// on ajoute 1 à la cellule de référence (nombre de cellules A FUSIONNER)
    					// sinon, on remplace les références
    					} else {
    						$keyR[$col] = $key;
    						$valR[$col] = $val;
    					}
    				}
    			}
    		}
    	}
    	return $rowSpan;
    }
    2- table - affichage des tr/td avec rowspan (nombre de cellules A FUSIONNER) pour un array
    (je l'ai mis aussi dans une fonction, pour simplifier l'affichage et être réutilisable)
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // 2- table - affichage des tr/td avec rowspan (nombre de cellules A FUSIONNER) pour un array
    function table_set_trtd_rowspan_from_rowAll( $rowAll, $colsToFuse=NULL ) 
    {
    	// $colsToFuse : array des colonnes à prendre en compte pour les fusions de cellules 
    	// $colsToFuse = NULL : AUCUNE colonne (par défaut)
    	// $colsToFuse = [] : TOUTES les colonnes
     
    	$tr_td 		= '';
    	if( !empty($rowAll) )
    	{
    		// on récupère l array des rowspan
    		$rowSpan 	= table_get_rowspan_from_rowAll( $rowAll, $colsToFuse );
     
    		// pour chaque rangée
    		foreach( $rowAll as $key => $row )
    		{
    			$tr_td	.= '	<tr>'."\n";
    			// pour chaque colonne
    			foreach( $row as $col => $val )
    			{
    				// A- $rowSpan[$key][$col] est DEFINI
    				if( isset($rowSpan[$key][$col]) )
    				{
    					// A1- si plusieurs cellules : ON FUSIONNE
    					if( $rowSpan[$key][$col]>1 ) 
    					{
    						$tr_td	.= '		<td rowspan="'.$rowSpan[$key][$col].'">'.$val.'</td>'."\n";
    					} 
    					// A2- si 1 seule cellule : inutile d afficher rowspan=1
    					elseif( $rowSpan[$key][$col]==1 ) 
    					{
    						$tr_td	.= '		<td>'.$val.'</td>'."\n";
    					}
    					// A3- si 0 : on N affiche RIEN
    				} 
    				// B- $rowSpan[$key][$col] N est PAS DEFINI : cellule normale
    				else {
    						$tr_td	.= '		<td>'.$val.'</td>'."\n";
    				}
    			}
    			$tr_td	.= '	</tr>'."\n";
    		}
    	}
    	return $tr_td;
    }
    3- Affichage

    Le petit "plus" :
    • pouvoir définir les colonnes sur lesquelles appliquer les fusions
    • car il ne faut pas se le cacher : la fusion de cellules n'a généralement d'intérêt QUE sur la ou les premières colonnes...

    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
    	<table>
    	<caption>Tableau AVEC FUSION de cellules</caption>
    	<thead>
    		<tr>
    <?php
    		// 0- Affichage des titrees de colonnes
    		$cols = next($contacts);
    		foreach($cols as $col => $value){
    		echo '<th>'.ucfirst($col).'</th>';
    		}
    ?>
    		</tr>
    	</thead>
    	<tbody>
    <?php
    		// 1- array des colonnes sur lesquelles appliquer les FUSIONS de cellules
    		// A TESTER :
    	//	$colsToFuse = NULL; // (AUCUNE colonne)
    		$colsToFuse = []; 	// (TOUTES les colonnes)
    	//	$colsToFuse = ['pays','ville','extra'];
    	//	$colsToFuse = ['pays','ville'];
    	//	$colsToFuse = ['pays','extra'];
    	//	$colsToFuse = ['pays','ville','extra','autre'];
     
    		// 2- Affichage des tr/td
    		echo table_set_trtd_rowspan_from_rowAll( $contacts, $colsToFuse );
    ?>
    	</tbody>
    	</table>

    Et le plus beau : ça fonctionne (du 1er coup) !!




    Un array, pour tester :
    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
    33
    34
    35
    36
    37
    <?php
    // array des données
    $contacts = array(
    0 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'prenom' => 'Aline','extra'=>1, 'autre'=>2),
    1 => array('pays' => 'BELGIQUE', 'ville' => 'BRUXELLES', 'prenom' => 'Aline','extra'=>2, 'autre'=>1),
    2 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Aline','extra'=>1, 'autre'=>2),
    3 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Aline','extra'=>1, 'autre'=>2),
    4 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Charlie','extra'=>2, 'autre'=>1),
    5 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Charlie','extra'=>1, 'autre'=>0),
    6 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Esat','extra'=>1, 'autre'=>0),
    7 => array('pays' => 'BELGIQUE', 'ville' => 'LIEGE', 'prenom' => 'Framboise','extra'=>1, 'autre'=>2),
    8 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'prenom' => 'Gus','extra'=>1, 'autre'=>2),
    9 => array('pays' => 'FRANCE', 'ville' => 'AMIENS', 'prenom' => 'Helma','extra'=>1, 'autre'=>2),
    10 => array('pays' => 'FRANCE', 'ville' => 'BORDEAUX', 'prenom' => 'Isidore','extra'=>1, 'autre'=>2),
    11 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Jacqueline','extra'=>1, 'autre'=>2),
    12 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Kev','extra'=>1, 'autre'=>0),
    13 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Aline','extra'=>1, 'autre'=>0),
    14 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Aline','extra'=>1, 'autre'=>0),
    15 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Aline','extra'=>1, 'autre'=>2),
    16 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Aline','extra'=>1, 'autre'=>2),
    17 => array('pays' => 'FRANCE', 'ville' => 'PARIS', 'prenom' => 'Pat','extra'=>1, 'autre'=>2),
    18 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'prenom' => 'Quat','extra'=>1, 'autre'=>2),
    19 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'prenom' => 'Rania','extra'=>1, 'autre'=>2),
    20 => array('pays' => 'GABON', 'ville' => 'PORT-GENTIL', 'prenom' => 'Sembene','extra'=>1, 'autre'=>2),
    21 => array('pays' => 'GABON', 'ville' => 'FRANCEVILLE', 'prenom' => 'Tia','extra'=>1, 'autre'=>2),
    22 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Ugo','extra'=>1, 'autre'=>2),
    23 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Vasco','extra'=>1, 'autre'=>2),
    24 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Wemba','extra'=>1, 'autre'=>2),
    25 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Yam','extra'=>1, 'autre'=>0),
    26 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Yam','extra'=>1, 'autre'=>0),
    27 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Yam','extra'=>2, 'autre'=>1),
    28 => array('pays' => 'GABON', 'ville' => 'LAMBARENE', 'prenom' => 'Zelda','extra'=>1, 'autre'=>2),
    29 => array('pays' => 'USA', 'ville' => 'PARIS', 'prenom' => 'Jacqueline','extra'=>1, 'autre'=>2),
    30 => array('pays' => 'USA', 'ville' => 'PARIS', 'prenom' => 'Yam','extra'=>1, 'autre'=>2),
    31 => array('pays' => 'USA', 'ville' => 'LOS ANGELES', 'prenom' => 'Yam','extra'=>1, 'autre'=>2),
    32 => array('pays' => 'USA', 'ville' => 'LAS VEGAS', 'prenom' => 'Momo','extra'=>1, 'autre'=>2)
    );
    Dernière modification par Invité ; 19/08/2018 à 16h17.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bon.
    Je sais qu'on a perdu en route mjdell depuis longtemps...

    Mais il faut quand même lui expliquer :
    • on peut générer l'array $contacts (ou tout autre nom, à ta convenance) avec les données de la requête en BDD :

    @mjdell
    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
    $recettes = []; // array
    $ii = 0;
    while ($donnees = $reponse->fetch())
    {
    	$recettes[$ii]['Date de saisie'] = $donnees['jour2'].'/'.$donnees['mois'].'/'.$donnees['annee'];
     
    	$recettes[$ii]['Visuel'] = '<img src="../'.$donnees['image'].'" width="100" >'; 
    	// Visuel : je suppose ici que l image est enregistrée en BDD (ce qui n'est actuellement pas le cas)
    	// sinon, il faut remettre ton mic-mac de conditions, pour afficher la bonne image
     
    	$recettes[$ii]['Produit'] = $donnees['produit'];
    	$recettes[$ii]['Quantité'] = $donnees['quantite'];
    ...
    	$ii++;
    }
    Et pour l'affichage :
    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
    	<table>
    	<thead>
    		<tr>
    <?php
    		// 0- Affichage des titrees de colonnes
    		$cols = next($recettes);
    		foreach($cols as $col => $value){
    		echo '<th>'.ucfirst($col).'</th>';
    		}
    ?>
    		</tr>
    	</thead>
    	<tbody>
    <?php
    		// 1- array des colonnes sur lesquelles appliquer les FUSIONS de cellules
    		$colsToFuse = ['Date de saisie'];
     
    		// 2- Affichage des tr/td
    		echo table_set_trtd_rowspan_from_rowAll( $recettes, $colsToFuse );
    ?>
    	</tbody>
    	</table>
    Dernière modification par Invité ; 19/08/2018 à 10h44.

Discussions similaires

  1. Affichage des dates dans un tableau html
    Par flobos dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/07/2017, 09h59
  2. [WD17] Mauvais affichage du champ date dans un tableau
    Par GAJES dans le forum WinDev
    Réponses: 14
    Dernier message: 24/08/2016, 10h52
  3. [MySQL] affichage d'une date dans un tableau
    Par toomou dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2009, 10h56
  4. affichage et calcule de la date dans un tableau
    Par argon dans le forum Interfaces Graphiques en Java
    Réponses: 35
    Dernier message: 22/06/2006, 10h51
  5. [VB.NET] - affichage dynamique dans un tableau
    Par karibouxe dans le forum ASP.NET
    Réponses: 8
    Dernier message: 20/06/2005, 15h07

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