Page 1 sur 1

Affichage avec implode/rtrim

Posté : 05 août 2012, 13:58
par YADev
Bonjour,

Je récupère des données depuis ma BDD. J'arrive à les récupérer avec succès, le seul problème est que je n'arrive pas à les formater correctement.

Quand je les récupères à l'état brute, elles sont sous cette forme :
  • Machin 1
  • Machin 2
  • Machin 3
Mais moi, pour économiser de la place (et même graphiquement, pour que cela rende mieux) je veux faire comme ceci :
  • Machin 1, Machin 2, Machin 3
Pour cela, je connais implode. Mais cela ne semble pas fonctionner. Il faut dire que c'est assez particulier car j'éssai de faire quelque chose sous phpBB.
Voici la partie du code qui est concernée, sachez que celle-ci est dans une boucle (dans le cas ou il y a plusieurs lignes de résultat à retourner).
rtrim($row['poll_option_text'], ', ')
$row['poll_option_text'] contient bien ce que je cherche, la variable n'est pas en faute. Mais plutôt la façon dont on la traite avec PHP.
Regardez cette image, voyez que logiquement les résultats devraient être séparés par une virgule dans le cas ou il s'agit du même membre :
Capture.PNG
Vous comprenez mon souci ? Quand je tente avec implode cela ne fonctionne pas non plus... Je commence à me poser des questions ! :P

Merci pour votre aide.

Re: Affichage avec implode/rtrim

Posté : 05 août 2012, 15:51
par xTG
Tel que tu nous le présentes implode ou autre ne changera rien.
Tu as une boucle avec un enregistrement par itération et non un membre.
Voici une situation similaire si ça peut t'aider à comprendre :
$array = array(
 0 => array( 'titre' => 'test', 'value' => 1),
 1 => array( 'titre' => 'test2', 'value' => 1),
 2 => array( 'titre' => 'test', 'value' => 2)
);
$datas = array();
foreach($array as $val){ // équivalent de ta boucle de récupération bdd
    $datas[$val['titre']][] = $val['value'];
}
// affichage
foreach($datas as $titre => $val){
  echo $titre . ' : ' . implode(', ',$val) . '<br />';
}

Re: Affichage avec implode/rtrim

Posté : 05 août 2012, 16:38
par YADev
Tu as une boucle avec un enregistrement par itération et non un membre.
Exactement, j'ai d'ailleurs cherché par différents moyens de régler ça mais je n'ai pas trouvé. Par ce que dans la BDD, les votes sont enregistrés sur une ligne pour chaque vote, dans le cas ou le membre choisis plusieurs options au sondage alors il apparait sur différentes lignes dans la BDD, d'où le fait qu'il apparaisse plusieurs fois.

J'ai observé le bout de code, et il faudrait donc user de for à l'intérieur de ma boucle while pour régler le problème ? Quelque chose comme ça :
$datas = array();

foreach($row[] as $val){ // Le contenu du tableau de la boucle While est initialement inscrit dans la variable $row.
    $datas[$val['poll_title']][] = $val['poll_option_text']; // Je ne comprends pas trop cette partie.
}

foreach($datas as $titre => $val){
  // Là je créé le contenu à afficher.
';
:?:

Re: Affichage avec implode/rtrim

Posté : 05 août 2012, 18:25
par xTG
Non, mon premier foreach() était là car plus facile, mais il représente ta boucle. ;)

Re: Affichage avec implode/rtrim

Posté : 05 août 2012, 19:09
par sirakawa
Elementaire et beau mon cher xTG. Je surcommente simplement
<?PHP
/*Ceci simule la bdd*/
$array = array(
 0 => array( 'auteur' => 'ernest', 'value' => 1),
 1 => array( 'auteur' => 'jean', 'value' => 1),
 2 => array( 'auteur' => 'ernest', 'value' => 2)
);
/*ceci simule lecture de la bdd   il faut modifier le code d'origine de lecture de la bdd*/
$datas = array();
foreach($array as $val){ // équivalent de ta boucle de récupération bdd
    $datas[$val['auteur']][] = $val['value'];
}
/* ça peut donner un truc dans le genre de:*/
$datas = array();
$lien = mysql_connect("","","");
$mabase ="";
mysql_select_db (*mabase);
$requete = "select auteur, commentaire from $mabase where 1";
$resultat = mysql_query ($requete);
while ($ligne = mysql_fetch_array($resultat))
{
	$auteur = $ligne[0];
	$commentaire = $ligne[1];
	$datas[$auteur][] = $commentaire;
}

// affichage qui est le code simplissime de xTG
foreach($datas as $auteur => $val){
  echo $auteur . ' : ' . implode(', ',$val) . '<br />';
}
?>}

Re: Affichage avec implode/rtrim

Posté : 06 août 2012, 08:17
par YADev
D'accord. Comme je débute je n'ai jamais eu à utiliser foreach même si je me suis documenté à son sujet.

J'ai donc fais comme cela, mais cela ne fonctionne pas trop. Je dois encore rater quelque chose qui est sous mon nez :|
	// Vars templates of list.
$author = substr($username_full, 0, -2);  // Là j'ai le pseudo
$chose_poll = $row['poll_option_text']; // Là les choix du membres
$datas[$author][] = $chose_poll;
		  		  
foreach($datas as $author => $total)
{
	$template->assign_block_vars('user_row', array(
        'LIST_VOTES'	=> implode(', ',$total))); // Je créé la variables templates pour afficher les choix que j'utiliserais par la suite.
}
Capture.PNG
Pardon si j'ai un peu de mal mais bon :oops:
Pour moi c'était censé être bon vu qu'en PHP on dit "Affichez la valeur selon le pseudo du membre". Non ?

Re: Affichage avec implode/rtrim

Posté : 06 août 2012, 20:19
par xTG
Tu as mis une boucle dans une boucle je suppose ?
Il faut bien deux boucles (mais pas imbriquées !) comme indiqué dans mon code (voir les commentaires de sirakawa pour mieux te repérer).

Re: Affichage avec implode/rtrim

Posté : 07 août 2012, 13:20
par YADev
Ha mais je suis obligé !

Je donne un peu le code de la zone concernée :
	while ($row = $db->sql_fetchrow($result))
	{					
		  // Vars templates.			  
		  $template->assign_block_vars('user_row', array(
		  'WHO_VOTED'  	=> substr($username_full, 0, -2),
		  'TITLE_POLL'	=> $row['poll_title'],
		  'LIST_VOTES'	=> rtrim($row['poll_option_text'], ', ') 
));
	}
La, je créé une variable de template LIST_VOTES, obligatoirement elle doit être dans la boucle car doit contient le résultat selon l'user (WHO_VOTED). Je ne peux pas la mettre hors de la boucle while, ou alors je ne vois pas du tout comment faire. #-o

Si jamais je la met hors de la boucle while, rien ne s'affiche. :(

Re: Affichage avec implode/rtrim

Posté : 07 août 2012, 13:44
par Mazarini
Ce qui est proposé, c'est de remplir un array PHP avec les données lu dans la base
<?PHP
$tab = array();
while ($row=mysql_fetch_array(...)) {
   $auteur = $row['auteur'];
   $titre= $row['titre'];
   $choix= $row['choix'];
   $tab[$auteur][$titre][] = $choix; // regroupement des choix par auteur et par titre des choix
}
?> 
et ensuite d'afficher en parcourant l'array PHP :
<?PHP
foreach ($tab as $auteur=>$titres) {        // boucle sur les auteurs
   foreach ($titres as $titre=>$choix) {     // boucle sur les titres d'un auteur
      $listeChoix = implode($choix,', ');      // regroupement des choix
//  affichage avec $auteur, $titre et $listeChoix
   }
}

?> 
J'ai supposé qu'il pouvait y avoir plusieurs titres pour un auteur mais ca marche avec un seul titre aussi.

Re: Affichage avec implode/rtrim

Posté : 07 août 2012, 15:38
par YADev
Il y a un titre de sondage, un membre, et possibilité de plusieurs choix pour chaque membre.
Je travail sous phpBB, donc c'est comme ici.
$tab = array();

while ($row = $db->sql_fetchrow($result))
	{			
		  $user_colour = ($row['user_colour']) ? ' style="color:#' . $row['user_colour'] . '" class="username-coloured"' : '';
		  $username_full = ($row['user_type'] != USER_IGNORE) ? get_username_string('full', $row['user_id'], $row['username'], 
		  $row['user_colour']) . ', ' : '<span' . $user_colour . '>' . $row['username'] . '</span>, ';			
					
		  // Vars templates.			  
		  $template->assign_block_vars('user_row', array(
		  'WHO_VOTED'  	=> substr($username_full, 0, -2),
		  'TITLE_POLL'	=> $row['poll_title'],
		  // 'LIST_VOTES'	=> rtrim($row['poll_option_text'], ', ') 
		   ));
		   
		   // Var for displaying votes.
		   $author = substr($username_full, 0, -2);
		   $title = $row['poll_title'];
		   $poll_text = $row['poll_option_text'];
		   $tab[$author][$title][] = $poll_text;
	}
	
   // Display choices.
   foreach ($tab as $author => $choix) 
   {
		  $template->assign_block_vars('user_row', array(
		  'LIST_VOTES'	=> implode($choix,', '); 
		   ));
   }	

Mais ce n'est pas bon, rien ne s'affiche ... :cry:
C'est bien formaté pourtant non ?

Re: Affichage avec implode/rtrim

Posté : 07 août 2012, 19:51
par Mazarini
La première boucle "while" ne fait que du stockage dans un $tab, pas de sortie à faire.

Pour l'exploitation du tableau, faire 2 foreach sur auteur et sur titre