Tableau

Zappathebest
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 17:57

Bsoir a tous

voila j'a un ptit porbleme, je fais une requet (while) donc tableau je voudrai faire un affichage du genre :

1 . 2 . 3
4 . 5 . 6

au lieu de

1
2
3
4
5
6

donc j'ai un script qui marche sous ie mais pas sous mozilla, je trouve ça zab ou est mon erreur ?

voici mon script :
$req="SELECT * from scat where cat='11' order by scat ";
$blup=mysql_query($req);


echo "<table width=\"500\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"3\"> \n";
echo "<tr>";
$i=1;
while ($res = mysql_fetch_array($blup)) { 

echo "<td>";


if($t==0){$t=1;}

  echo "".$res[scat].""; 

  
  if ($i % 3 == 0) 
  echo "</td>"; 
  $i++; 
  $t=$t+1;
  echo "</tr>";


}   
echo "</table> \n";
D'avance merci ;)

ViPHP
ViPHP | 928 Messages

17 janv. 2008, 18:20

Bonjour,
je déteste ce genre d'affichage moi aussi, je passe mon temps à m'embrouiller entre les <tr> à ajouter ou pas.

Mais il y a un moyen simple : il suffit déjà de réorganiser ton tableau en PHP, en faisant un tableau à deux dimensions comme ceci :
<?php

// On considère ce tableau initial
$tab = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Combien de "cellules" par ligne
$cell = 3;

// Réorganisation en tableau à deux dimensions
$count = count($tab);
$new_tab = array();
for ($i = 0; $i < $count; $i++)
{
	$new_tab[floor($i / $cell)][] = $tab[$i];
}

// Structure de ton tableau réorganisé ($new_tab)
echo '<pre>';
print_r($new_tab);

?>
tu obtiens en sortie un tableau à deux dimensions donc :

Code : Tout sélectionner

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [1] => Array ( [0] => 4 [1] => 5 [2] => 6 ) [2] => Array ( [0] => 7 [1] => 8 [2] => 9 ) [3] => Array ( [0] => 10 ) )

Après c'est un jeu d'enfant de l'afficher, il suffit d'avoir un code du genre, et ça marche à tous les coups :
echo '<table width="100%" border="1">';
foreach ($new_tab AS $ligne)
{
	echo '<tr>';
	foreach ($ligne AS $col)
	{
		echo '<td>' . $col . '</td>';
	}
	echo '</tr>';
}
echo '</table>';
le tout sans se prendre la tête avec des modulos :D

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 18:57

merci ;)

Ok j'ai fait ca mais le résultat n'est pas bon j'obtien

1 , 1 , 1

2 , 2 , 2

3 , 3 , 3

4 , 4 , 4

5 , 5 , 5


Alors que je veu

1 ,2 ,3
4 ,5 ,6

voici mon code
<?php 

// On considère ce tableau initial 
$tab = array(1, 2, 3); 

// Combien de "cellules" par ligne 
$cell =3; 

// Réorganisation en tableau à deux dimensions 
$count = count($tab); 
$new_tab = array(); 
for ($i = 0; $i < $count; $i++) 
{ 
    $new_tab[floor($i / $cell)][] = $tab[$i]; 
} 

// Structure de ton tableau réorganisé ($new_tab) 
echo '<pre>'; 
print_r($new_tab); 



$req="SELECT * from scat where cat='11' order by scat ";
$blup=mysql_query($req);



while ($res = mysql_fetch_array($blup)) { 

echo '<table width="100%" border="1">'; 
foreach ($new_tab AS $ligne) 
{ 
    echo '<tr>'; 
    foreach ($ligne AS $col) 
    { 
        echo '<td>' .$res[scat]. '</td>'; 
    } 
    echo '</tr>'; 
} 
echo '</table>'; }

?>

ViPHP
ViPHP | 928 Messages

17 janv. 2008, 19:25

Hmm tu as mal interprété ma réponse en fait, il ne s'agissait pas de faire un copié collé :)

Donne nous plutôt la structure de ta table SQL, et le type d'affichage que tu souhaites obtenir.

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 19:40

Ok en gros je vais cherché qu'un truc dans ma table (liste de sous catégorie (annuaire)) donc je en gros un while standard donnerai :

coiffure
Soins
Esthetique
SPA
Epilage

en gros pour eviter d'avoir tous dans une colonne je voudrai qu'il s'affiche par 3 dans le genre :

coiffure Soins Esthetique
SPA Epilage

D'ou ma requete :
$req="SELECT * from scat where cat='11' order by scat "; 
$blup=mysql_query($req); 

avec le while qui suit bien sur

Marci ;)

ViPHP
ViPHP | 928 Messages

17 janv. 2008, 19:54

Dans ton cas ce serait quelque chose comme ça qu'il faudrait faire :
$cell = 3;

// Ici ça construit ton tableau à deux dimensions
$req = "SELECT * from scat where cat='11' order by scat "; 
$blup = mysql_query($req) OR die(mysql_error());
$tab = array();
$i = 0;
while ($row = mysql_fetch_assoc($blup))
{
   $tab[floor($i % $cell)][] = $row;
}
mysql_free_result($blup);

// Ici tu l'affiches
echo '<table>';
foreach ($tab AS $line)
{
   echo '<tr>';
   foreach ($line AS $col)
   {
      echo '<td>' . $col['scat'] . '</td>';
   }
   echo '</tr>';
}
echo '</table>';

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 20:23

merci pour ce script mais il me met tout a la suite

coiffure Soins Esthetique SPA Epilage

au lieu de l'affichage par 3 je n'ai rien touché au script j'ai fait copier colloer

;)

ViPHP
ViPHP | 928 Messages

17 janv. 2008, 20:36

J'ai oublié un détail, remplace
$tab[floor($i % $cell)][] = $row; 
par
$tab[floor($i++ % $cell)][] = $row; 

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 20:49

Ok c'est presque ça sauf que la $cell indique le nbr de cellule en vertical alors qu'il me les faut en horizontal

Encore merci ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 janv. 2008, 22:51

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 22:52

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)
Non c'est pas résolu :( , mais je vais m'inscrire de ce pas ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 janv. 2008, 23:08

Modération :
Puisque ta question n'est pas résolue, j'enlève le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il ne contient pas encore
de solution, mais qu'on va bien finir par t'en trouver une, ronthudjiou ! ;)


Bon et euh sinon, je n'ai fait que survolé le code proposé par Genova (qui m'a l'air assez court et bien pratique), mais pour ma part je fais habituellement un peu ce sur quoi tu étais parti avec le modulo. Je suis arrivé à un bout de code très simple que je réutilise à chaque fois... j'ai commenté un maximum, si jamais ça peut aider et/ou clarifier le modulo... sur ce, j'vais aller regarder comment fonctionne celui de Genova :)
<table>
	<th>Colonne 1</th>
	<th>Colonne 2</th>
	...

<?php

$nbCols = 3; // nombre de colonnes du tableau
$cpt = 0; // compteur d'éléments

$rs = mysql_query(...); // exécution de la requête
while ($row=mysql_fetch_array($rs)) { // parcours des résultats

	$cpt++; // on incrémente le compteur

	// nouvelle ligne
	if ($cpt%$nbCols==1) // si le modulo du nb d'élément par le nb de colonnes est de 1 ...
		echo '<tr>'; // ..., on est sur le premier élément d'une ligne

	// On place chaque élément dans une cellule du tableau
	echo '<td width="'.round(100/$nbCols).'%">'; // on donne la même largeur à toutes les cellules
	echo ... // affichage de tout ce qu'on veut dans la cellule
	echo '</td>';

	if ($cpt%$nbCols==0) // si le modulo du nb d'élément par le nb de colonnes est de 0 ...
		echo '</tr>'; // ..., on est sur le dernier élément d'une ligne
}

if ($cpt!=0 && $cpt%$nbCols!=0) // S'il n'y a pas eu assez de cellules pour finir la ligne
	echo '<td colspan="'. ($nbCols - $cpt%$nbCols) .'">&nbsp;</td></tr>'; // on complète avec ce qui manque

if ($cpt==0) // Enfin, si la requête n'a pas retourné d'élément
	echo '<tr><td colspan="'.$nbCols.'">Aucun résultat</td></tr>'; //  on colle éventuellement un p'tit message :)
?>

</table>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

17 janv. 2008, 23:30

Modération :
Puisque ta question n'est pas résolue, j'enlève le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il ne contient pas encore
de solution, mais qu'on va bien finir par t'en trouver une, ronthudjiou ! ;)


Bon et euh sinon, je n'ai fait que survolé le code proposé par Genova (qui m'a l'air assez court et bien pratique), mais pour ma part je fais habituellement un peu ce sur quoi tu étais parti avec le modulo. Je suis arrivé à un bout de code très simple que je réutilise à chaque fois... j'ai commenté un maximum, si jamais ça peut aider et/ou clarifier le modulo... sur ce, j'vais aller regarder comment fonctionne celui de Genova :)
<table>
	<th>Colonne 1</th>
	<th>Colonne 2</th>
	...

<?php

$nbCols = 3; // nombre de colonnes du tableau
$cpt = 0; // compteur d'éléments

$rs = mysql_query(...); // exécution de la requête
while ($row=mysql_fetch_array($rs)) { // parcours des résultats

	$cpt++; // on incrémente le compteur

	// nouvelle ligne
	if ($cpt%$nbCols==1) // si le modulo du nb d'élément par le nb de colonnes est de 1 ...
		echo '<tr>'; // ..., on est sur le premier élément d'une ligne

	// On place chaque élément dans une cellule du tableau
	echo '<td width="'.round(100/$nbCols).'%">'; // on donne la même largeur à toutes les cellules
	echo ... // affichage de tout ce qu'on veut dans la cellule
	echo '</td>';

	if ($cpt%$nbCols==0) // si le modulo du nb d'élément par le nb de colonnes est de 0 ...
		echo '</tr>'; // ..., on est sur le dernier élément d'une ligne
}

if ($cpt!=0 && $cpt%$nbCols!=0) // S'il n'y a pas eu assez de cellules pour finir la ligne
	echo '<td colspan="'. ($nbCols - $cpt%$nbCols) .'">&nbsp;</td></tr>'; // on complète avec ce qui manque

if ($cpt==0) // Enfin, si la requête n'a pas retourné d'élément
	echo '<tr><td colspan="'.$nbCols.'">Aucun résultat</td></tr>'; //  on colle éventuellement un p'tit message :)
?>

</table>
C'est nikel merci beaucoup !!

VOus pouvez mettre le tag résolu

Bonne soirée a tous ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 janv. 2008, 01:49

Ah ! Je l'savais bien qu'on y viendrait !! ;)

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.


Mais que ça ne te dispense pas de t'inscrire pour le faire toi même par la suite :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...