2010-11-12 20 views
2

J'ai un tableau associatif et je génère beaucoup de choses différentes avec ce tableau.dernière entrée dans une boucle

La sortie I besoin a la forme

aa, ab, ac, ad, af, ak, az 

Ainsi, la dernière entrée n'a pas une virgule après

{section name=i loop=$aColums} 
    {if $aColums[i].contshow eq 'y'} 
    {$aColums[i].Name} 
    {endif} 
{/section} 

Mon problème est que je ne sais pas quand je suis arrivé la dernière valeur, qui a l'attribut contshow=y. Donc, ma pensée suivante était d'appliquer la virgule avant d'écrire aColums[i].Name. Mais ici, j'ai un problème similaire parce que je ne sais pas quand j'ai atteint la première valeur avec contshow=y. Est-ce que quelqu'un a une suggestion?

Répondre

0

La manière générale de traiter ceci est d'écrire les virgules avant chaque élément. De cette façon, le cas spécial est l'élément premier (qui n'a pas besoin d'une virgule précédente) plutôt que le dernier, et il est beaucoup plus facile de déterminer si vous voyez le premier élément ou non. Définissez tout d'abord un indicateur booléen sur true, puis définissez-le sur false après avoir identifié une entrée.

Rappelez-vous, Smarty pourrait avoir une fonction utilitaire pour "joindre" le tableau avec une chaîne donnée (dans ce cas, une virgule). Si une telle fonction existe, l'utiliser directement serait la meilleure option.

+0

peut-être je fais quelque chose de mal, mais après j'attribuer une valeur, il semble que Smarty va pas le changer {assign var = valeur "tv" = "false "} et dans le cas de match –

3

Il existe une autre méthode, utilisant la propriété .last de la section.

{section name=i loop=$aColums} 
    {if $aColums[i].contshow eq 'y'} 
    {$aColums[i].Name}{if $smarty.section.i.last eq false}, {/if} 
    {endif} 
{/section} 

Cela ajoute un « » après chaque nom de sortie - à moins que c'est la dernière itération de la {section}. Je suppose que les données de votre tableau $ aColums n'ont pas encore de virgules.

Vous avez également une autre option - pregenerate cette chaîne en PHP en utilisant imploser:

$aColumsString = implode(', ', $aColums); 
$smarty->assign('aColumsString', $aColumsString); 

Ensuite, il suffit de sortie au modèle selon les besoins. Si vous avez besoin de la liste avec des virgules plus d'une fois, c'est probablement la méthode la plus efficace. Si vous en avez besoin une fois, c'est probablement un bon coup de poker.

0

Dans Smarty 3, cela est beaucoup plus simple:

{foreach $aColumns AS $aCol} 
    {$aCol}{if not [email protected]}, {/if} 
{/foreach}