Page 1 sur 1

Bon affichage après un explode avec foreach

Posté : 09 mai 2007, 23:58
par lilo
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 ;)

Posté : 10 mai 2007, 07:06
par guilt92
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 ?

Posté : 10 mai 2007, 08:45
par Ryle
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 :))

Posté : 10 mai 2007, 08:46
par lilo
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.

Posté : 10 mai 2007, 08:49
par Invité
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 :)

Posté : 10 mai 2007, 08:58
par Ryle
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 ;)

Posté : 10 mai 2007, 09:01
par lilo
Merci beaucoup à vous deux :)

Je testerais chez moi.

Posté : 10 mai 2007, 10:58
par orgerix
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.