如何从foreach中获得第一个索引?


Smarty how to get a first index from foreach?

结构如下:

<!-- projects list -->
            {if !empty($userObjects)}
                <select id="projects-list" tabindex="1" name="project">
                    {if !isset($selected)}<option value="0">Choose project</option>{/if}
                {foreach from=$userObjects item=v}
                    <option value="{$v.Id}" {if $selected==$v.Id}selected="selected"{/if} }>{$v.Name}
                        {* if it's 1st element *}
                        {if $smarty.foreach.v.index == 0}
                            {if isset($limit)}<br /><span id="projlimit">{$limit}</span> {$currency->sign}{/if}
                        {/if}
                    </option>
                {/foreach}
                </select>

你可以看到我做了

{if $smarty.foreach.v.index == 0}

但是出了问题。在这种情况下,所有options元素都有一个$limit值。如何让它变好?我只需要第一个

我不想显得粗鲁,但Bondye的答案并不适用于所有情况。由于PHP的数组是有序映射,所以第一个键的值不会总是为0。

在这些情况下,您可以使用@index, @iteration@first属性。更多详细信息请参见smarty foreach文档http://www.smarty.net/docs/en/language.function.foreach.tpl#foreach.property.iteration

你的问题的一个可能的解决方案如下:

{foreach $rows as $row}
    {if $row@iteration == 1}
        First item in my array          
    {/if}            
{/foreach}

您可以使用以下代码:

{foreach from=$userObjects item=v name=obj}
    {if $smarty.foreach.obj.first}
        This is the first item
    {/if}
    {if $smarty.foreach.obj.last}
        This is the last item.
    {/if}
{/foreach}

可以通过数组键来实现吗?

{foreach from=$rows key=i item=row}
     {if $i == 0}
         First item in my array
     {/if}
{/foreach}

最好的解决方案是定义自定义索引变量并增加它

这是我的工作干净的解决方案:

{assign var="index" value=-1}
{foreach from=$myArrObjects item=arrObject}
   {if $index == -1}
      {assign var="index" value=$index+1}
      <!-- Do whatever you want with the index now :) -->
   {/if}    
{/foreach}

在Smarty中,您可以使用foreach @first属性来获取第一个迭代/元素。如果当前{foreach}迭代是初始迭代,则属性为TRUE。

下面是一个示例代码:
{foreach $items as $item}
    {if $item@first}
        this is the first item
    {/if}
{/foreach}

还有其他一些有用的foreach属性,如@last用于获取最后一次迭代,@total用于获取迭代的总次数。