2012-02-01 7 views
1

в приложении PHP, использующем Smarty. Я хочу передать многомерный ассоциативный массив со значениями, описывающими элементы и группы элементов, шаблону и отображать его как список.Итерация по многомерному ассоциативному массиву в шаблоне 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} 

Hopes это поможет вам более

+0

Спасибо за ответ. Этот подход работает, если мы знаем максимальную глубину дерева элементов, как в примере, указанном в вопросе. Однако то, что я действительно пытался сделать, но не мог заставить его работать, - это обрабатывать любую глубину дерева - это причина использования рекурсивного шаблона. Любые идеи об этой проблеме? – user485332

Смежные вопросы