Bon affichage après un explode avec foreach

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Bon affichage après un explode avec foreach

par orgerix » 10 mai 2007, 10:58

OU alors tu peux ajouter une ligne à la fin du foreach (en dehors)
$str=substr(str,0,strlen($requet)-1);
Cette fonction te permet d'enlever le dernier caractère de la chaine.

par lilo » 10 mai 2007, 09:01

Merci beaucoup à vous deux :)

Je testerais chez moi.

par Ryle » 10 mai 2007, 08:58

Plusieurs solutions :

- Pour ne pas stocker les cases non cochées, tu fais ce test au moment ou tu concatènes tes valeurs avant de les mettre en base. Du coup, au lieu d'un foreach, tu peux faire un implode pour génrer la chaine à partir du tableau et lui passer ', ' comme séparateur :
echo implode(', ', $tableau);
- Au lieu d'afficher directement la valeur tu passes par une chaine intermédiaire, ce qui te permet de tester si elle est vide ou non avant d'y ajouter un nouvel élément :
$str = '';
foreach ($tableau as $valeur) {
  if ($str != '')
    $str.= ', '; // ajout de la virgule si la chaine contient déjà des éléments
  $str.= $valeur; // ajout de la valeur
}
echo $str;
Pis y en a surement d'autres, mais c'est déjà bien ;)

par Invité » 10 mai 2007, 08:49

Oups oui Ryle il s'agit juste d'un mauvais nom d'exemple que j'ai donné, je n'ai pas fait attention que c'était le même nom lol

J'ai bien pensé à faire une table intermédiaire mais je me suis dit que c'était assez petit et l'exploitation n'était pas énorme c'est pour ça que j'ai opté pour la concaténation.

Ca m'aurait fait tout plein de champ dans le cas contraire.

Une idée pour enlever cette dernière virgule ? :)

Michi :)

par lilo » 10 mai 2007, 08:46

Hello guilt92, merci pour ton aide :)

En fait il s'agit de plusieurs cases à cocher. Lors de l'insertion, je concatène tout en une seule et unique variable pour l'insérer dans un seul champ. C'est pour cela qu'il y a des endroits sans valeur, les cases n'étant pas toutes cochées.

Je concatène toutes les valeurs.

J'avais fait ce que tu as dis, ça fonctionne presque comme il faut mais ce n'est pas encore tout à fait ce que je veux.

Il va m'afficher val1, val3, au lieu de val1, val3. Il mettra la virgule à la fin.

par Ryle » 10 mai 2007, 08:45

guilt92 t'a donné la solution, il suffit en effet de tester si la chaine est vide ou non pour savoir s'il faut l'afficher ou pas :)

Pour les chaines vides stockées en base malgré tout, je pense que le fait de concatener des valeurs dans un même champ (outre le fait qu'on ne peut absolument pas l'exploiter) l'oblige en plus à conserver les positions pour savoir à quelle valeur correspond quoi.
D'un point de vue conception il aurait mieux valu utiliser une colonne par valeur si leur nombre est défini (et peu élevé) ou une table intermédiaire pour les lier, ce qui permettrait également de pouvoir exploiter convenablement la base pour y faire une recherche, un filtre, etc.

Enfin, ça à l'air de marcher, mais y a ce truc qui me chiffonne :
foreach ($valeur as $valeur)
Je ne comprends pas comment le tableau $valeur n'est pas immédiatement écrasé par la première valeur générant une erreur dès la deuxième itération ? (ou alors c'était juste un exemple, mais dans ce cas, il n'est pas judicieux :))

par guilt92 » 10 mai 2007, 07:06

Je pense qu'il te suffit de tester la valeur de $valeur avant de l afficher et si elle est vide tu ne l'affiches pas... Soit avec un if($valeur!="") ou grace a la fonction empty() de php.
foreach ($valeur as $valeur) 
{ 
if(!empty($valeur)) echo $valeur.", "; 
}
Par contre est ce normal que tu aies cela dans la base de donnée ? ne serait il pas plus simple de ne pas insérer de valeurs vides dans ta base ?

Bon affichage après un explode avec foreach

par lilo » 09 mai 2007, 23:58

Bonjour,

J'ai un champ de ma table qui contient des données concaténées.

Je voudrais maintenant les afficher et j'ai un petit souci.

Exemple de valeur dans mon champ "val" : val1*val2*val3*val4

Je fais mon explode comme ceci :
$valeur = explode("*", $row['val']);
Et pour l'affichage je fais :
foreach ($valeur as $valeur)
{
echo $valeur.", ";
}
Juste que là tout va bien. Le problème que j'ai se pose quand j'ai par exemple dans mon champ : val1**val3*

Avec ce foreach l'affichage va me donner : val1, , val3,
ce qui n'est pas terrible. Je voudrais avoir val1, val3

C'est à dire afficher uniquement les valeurs non vide de ma concaténation.

Pouvez-vous m'aider ?

Merci bien ;)