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 :

Fusionner cellules tableau selon condition


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Points : 77
    Points
    77
    Par défaut Fusionner cellules tableau selon condition
    Salut,

    Voilà je rempli un tableau HTML avec des données (de type varchar) via une requête SQL s'appliquant sur une table.

    Comment pourrais-on effectuer un "rowspan" sur des cellules de même contenu (qui se suivent) dans une même colonne.

    Exemple :

    AVANT :

    col1|col2
    __________
    |x|aaab215
    --+--------+
    |y|2hj
    --+--------+
    |y|j46ghj
    --+--------+
    |z|ghjk94

    APRES :

    __________
    |x|aaab215
    --+--------+
    |y|2hj
    | |j46ghj
    --+--------+
    |z|ghjk94

    Merci de votre aide !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu ORDER ta requete sur la colonne x, ensuite quand tu fetch, tu as juste a regarder si la ligne en cours a la meme valeur x que la ligne que tu as lu avant.

  3. #3
    Membre régulier Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Points : 77
    Points
    77
    Par défaut
    Comme çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $marequete ="SELECT maColonne1,maColone2 FROM maTable ORDER BY maColonne1";
    $req=mysql_query($marequete);
    if(mysql_num_rows($req)>0){
    	$req1 = mysql_fetch_row($req);}
    if($req1[0]==$req[0]deLaLigneLuAvant){
            echo "<td rowspan=2>$req[0]</td>;}

    Je suis un peu en galère :

    Comment lui dire de comparer l'élément courant à l'élément de la ligne précédente ??

    Merci !

  4. #4
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Salut,

    le problème de regarde si celui d'avant est de la même colonne est pour calculer le rowspan.

    Personnellement, j'aurais stocké les informations dans un tableau formaté.
    Par exemple, au final le tableau serait comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $array = array();
    $array['x'] = array('aaab215');
    $array['y'] = array('xxx', 'yyyy');
    $array['z'] = array('1');
    ensuite tu génère ton tableau html à partir de celui-ci avec un code dans l'esprit de ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach ($array as $key => $value)
    {
      echo '<tr>';
      echo '<td rowspan=' . count($value)  . '>' . $key . '</td>';
      echo '<td>' . $value[0] . '</td>';
      echo '</tr>';
     
     for ($i = 1; $i < count($value) ; $i++)
     {
      echo '<tr><td>' . $value[$i] . '</td></tr>';
     }
    }
    Il faut commencer à 1 pour éviter de répeter la 1ere donnée.

  5. #5
    Membre régulier Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Points : 77
    Points
    77
    Par défaut
    C'est une bonne idée mais pour le mettre en place dans mon code actuel çà va être dur :

    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
     
    echo "
    <TABLE border=\"2\">
     
    	  						<tr>
    	  							<td><b>Rentree/Semestre</b></td>
    	 							<td><b>Conn. Scientif.</b></td>
    								<td><b>Techn. et Meth.</b></td>
    								<td><b>Stage</b></td>
    								<td><b>Express. Comm.</b></td>
    								<td><b>Culture Generale</b></td>
    								<td><b>Observation</b></td>
    							</tr>
     
     
     
     
    			";
     
    			$resultat= "SELECT * FROM resultat WHERE nomEtudiantResultat='$data[1]' AND prenomEtudiantResultat='$data[2]' ORDER BY semestreResultat";
    			$req = mysql_query($resultat) or die('Erreur SQL !<br>'.$resultat.'<br>'.mysql_error());
    			$req1 = mysql_num_rows($req);
     
    			if($req1>0){
    				// on fait une boucle qui va faire un tour pour chaque enregistrement
    				while($res = mysql_fetch_row($req)){
     
     
     
     
     
     
    					echo "
     
    						<tr>
     
    									<TD>$res[7]/$res[6]</TD>
    									<TD>
    									";
    									if($res[8]==2){
    										echo $res[3].' '.$res[4].' '.$res[5];}
    									echo "
    									</TD>
    									<TD>
    									";
    									if($res[8]==3){
    										echo $res[3].' '.$res[4].' '.$res[5];}
    									echo "
    									</TD>
    									<TD>
    									";
    									if($res[8]==5){
    										echo $res[3].' '.$res[4].' '.$res[5];}
    									echo "
    									</TD>
    									<TD>
    									";
    									if($res[8]==4){
    										echo $res[3].' '.$res[4].' '.$res[5];}
    									echo "
    									</TD>
    									<TD>
    									";
    									if($res[8]==1){
    										echo $res[3].' '.$res[4].' '.$res[5];}
    									echo "
    									</TD>
    									<TD>$res[9] - $res[10] - $res[11] - $res[12] - $res[13] - $res[14] - $res[15] - $res[16]</TD>
     
    						</tr>";
     
     
    				}
    }
    Voici les cellules que je voudrais fusionner (voir le screen). Ce sont les valeurs $res[6] et $res[7] pour la colonne1 et puis les valeurs $res[9], $res[10],$res[11],$res[12],$res[13],$res[14],$res[15] ,$res[16] pour la colonne 7.

    Remarque : ces valeurs seront toujours ensemble dans une même cellule.

    Merci de votre aide !

  6. #6
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    si la 1ere et la dernière colonne vont toujours ensemble tu peux tenter ce 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
     
    echo "
    <TABLE border=\"2\">
    	<tr>
    		<td><b>Rentree/Semestre</b></td>
    	 	<td><b>Conn. Scientif.</b></td>
    		<td><b>Techn. et Meth.</b></td>
    		<td><b>Stage</b></td>
    		<td><b>Express. Comm.</b></td>
    		<td><b>Culture Generale</b></td>
    		<td><b>Observation</b></td>
    	</tr>";
     
    	$resultat= "SELECT * FROM resultat WHERE nomEtudiantResultat='$data[1]' AND prenomEtudiantResultat='$data[2]' ORDER BY semestreResultat";
    	$req = mysql_query($resultat) or die('Erreur SQL !<br>'.$resultat.'<br>'.mysql_error());
    	$req1 = mysql_num_rows($req);
     
    	if($req1>0)
    	{
    		$datas = array();
    		// on fait une boucle qui va faire un tour pour chaque enregistrement
    		while($res = mysql_fetch_row($req))
    		{
    			$cleUnique = $res[7] . '/' . $res[6];
    			if (!isset($datas[$cleUnique]))
    				$datas[$cleUnique] = array(); // pour initialiser le tableau
     
    			$datas[$cleUnique][] = $row;
    		}
    	}
     
     
    	foreach ($datas as $key => $array)
    	{
    		$res = $array[0];
    		echo '<tr>';
    		$count = count($array);
    		if ($count > 0)
    			echo '<td rowspan="' . $count . '">';
    		else
    			echo '<td>';
    		echo $key;
     
    		if($res[8]==2)
    			echo $res[3].' '.$res[4].' '.$res[5];
     
    		echo '</TD><TD>';
     
    		if($res[8]==3)
    			echo $res[3].' '.$res[4].' '.$res[5];
     
    		echo '</TD><TD>';
     
    		if($res[8]==5)
    			echo $res[3].' '.$res[4].' '.$res[5];
     
    		echo '</TD><TD>';
     
    		if($res[8]==4)
    			echo $res[3].' '.$res[4].' '.$res[5];
     
    		echo '</TD><TD>';
     
    		if($res[8]==1)
    			echo $res[3].' '.$res[4].' '.$res[5];
     
    		echo '</TD>';
     
    		if ($count > 0)
    			echo '<td rowspan="' . $count . '">';
    		else
    			echo '<td>';
    		echo $res[9] - $res[10] - $res[11] - $res[12] - $res[13] - $res[14] - $res[15] - $res[16];
     
    		echo '</td></tr>';
     
    		for ($i = 1; $i < $count ; $i++)
    		{
    			$res = $array[$i];
    			// pas d'echo pour le 1er td, il est géré par le rowspan
    			echo '<TD>';
     
    			if($res[8]==3)
    				echo $res[3].' '.$res[4].' '.$res[5];
     
    			echo '</TD><TD>';
     
    			if($res[8]==5)
    				echo $res[3].' '.$res[4].' '.$res[5];
     
    			echo '</TD><TD>';
     
    			if($res[8]==4)
    				echo $res[3].' '.$res[4].' '.$res[5];
     
    			echo '</TD><TD>';
     
    			if($res[8]==1)
    				echo $res[3].' '.$res[4].' '.$res[5];
     
    			// pas d'echo pour le dernier td, géré par la 1ere ligne
    			echo '</td></tr>';
    		}
    	}
    Ce n'est pas le plus optimisé. Mais l'esprit est la. Pour optimiser tu peux regroupe le 2 traitements d'affichages avec un test sur $i pour savoir s'il faut afficher ou pas la 1er et dernière colonne.

  7. #7
    Membre régulier Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Points : 77
    Points
    77
    Par défaut
    Oui pour ta question, la première colonne et la dernière colonne vont toujours ensemble.

    Je teste ton code merci !

  8. #8
    Membre régulier Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Points : 77
    Points
    77
    Par défaut
    Re,

    A la ligne 42, il me dit :

    Notice: Undefined variable: row in C:\Program Files\wamp\www\test.php on line 42
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $datas[$cleUnique][] = $row;
    Bizarre, ais-je oublié quelque chose?

  9. #9
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Non cela vient de moi, j'ai mis $row (par habitude) au lieu de $res.

Discussions similaires

  1. Fusionner des cellules selon condition
    Par NONOSSONV dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/03/2015, 13h34
  2. [XL-2007] remplissage tableau selon condition
    Par NEC14 dans le forum Excel
    Réponses: 1
    Dernier message: 25/07/2010, 10h12
  3. Bloquer les cellules selon condition
    Par jokenjo dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/01/2008, 14h21
  4. [VBA W] : fusionner cellules vides dans tableau
    Par camzo dans le forum VBA Word
    Réponses: 6
    Dernier message: 26/09/2007, 17h01
  5. [HTML] Fusionner cellule tableau dynamique
    Par gaetanc15 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 08/03/2006, 13h48

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