2012-02-01 80 views
1

我想将多维关联数组与值描述项目和项目组,并将其显示为列表。在使用Smarty的PHP应用程序中迭代Smarty模板中的多维关联数组

我做这样的事情在的script.php:

$data = array(
    array(
     'type' => 'group', 
     'name' => 'Group 1', 
     'items' => array(
      array(
       'type' => 'group', 
       'name' => 'Group 2', 
       'items' => array(
        array(
         'type' => 'item', 
         'name' => 'Item 1' 
        ), 
        array(
         'type' => 'item', 
         'name' => 'Item 2' 
        ) 
       ) 
      ), 
      array(
       'type' => 'item', 
       'name' => 'Item 3' 
      ) 
     ) 
    ), 
    array(
     'type' => 'item', 
     'name' => 'Item 4' 
    ) 
); 
$smarty->assign('data', $data); 

而且我用它在主模板文件:

{include file="display_data.tpl" data="$data"} 

而且在display_data.tpl:

{if $data.type eq 'item'} 
    <li>{$data.name} ({$data.type})</li> 
{elseif $data.type eq 'group'} 
    <li> 
     {$data.name} ({$data.type}) 
     {include file="display_data.tpl" data=$data.items} 
    </li> 
{else} 
    <ol> 
     {foreach from=$data key=k item=i} 
      {include file="display_data.tpl" data=$data[$k]} 
     {/foreach} 
    </ol> 
{/if} 

但效果只有:

<ol> 
    <li>Group 1 (group)</li> 
    <li>Item 4 (item)</li> 
</ol> 

以任何方式,我无法让它遍历内部'项目'数组。我究竟做错了什么?

在此先感谢您的帮助。

回答

1

我觉得对于“子”项目的标记应该是:

{foreach from=$data key=k item=i} 
    {$i.name} ({$i.type}) 
    {if $i.items} 
     {foreach from=$i.data key=k item=k} 
      {$k.name} ({$k.type}) 
      {if $k.items} 
       {foreach from=$k.data key=k item=z} 
        {$z.name} ({$z.type}) 
       {/foreach} 
      {/if} 
     {/foreach} 
    {/if} 
{/foreach} 

希望这有助于你进一步

+0

感谢您的答复。如果我们知道项目树的最大深度,就可以使用这种方法,如上面给出的例子。然而,我真正想要做但却无法实现的工作是处理树的任何深度 - 这就是使用递归模板的原因。关于这个问题的任何想法? – user485332 2012-02-06 09:02:29