Smartyでネストしたループを扱う

連想配列の値が配列になっているデータ構造をSmartyで扱う場合、結論から言うと、foreachでは出来なかった*1ので、sectionでネストするのが確実?

test.php

<?php
require_once("libs/Smarty.class.php");
$smarty = new Smarty();

$items = array();
$items[] = array(
    'foo' => "hoge1", 'bar' => "hogehoge1",
    'sublist' => array(
        array('foo' => "moge11", 'bar' => "mogemoge11"),
        array('foo' => "moge12", 'bar' => "mogemoge12")));
$items[] = array(
    'foo' => "hoge2", 'bar' => "hogehoge2",
    'sublist' => array(
        array('foo' => "moge21", 'bar' => "mogemoge21"),
        array('foo' => "moge22", 'bar' => "mogemoge22"),
        array('foo' => "moge23", 'bar' => "mogemoge23")));
$smarty->assign("items", $items);

$smarty->display("test.tpl");
?>

test.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
{section name=pri loop=$items}
  pri_foo={$items[pri].foo}<br>
  pri_bar={$items[pri].bar}<br>
  {section name=sub loop=$items[pri].sublist}
    sub_foo={$items[pri].sublist[sub].foo}<br>
    sub_bar={$items[pri].sublist[sub].bar}<br>
  {/section}
{/section}
</body>
</html>

結果

pri_foo=hoge1
pri_bar=hogehoge1
sub_foo=moge11
sub_bar=mogemoge11
sub_foo=moge12
sub_bar=mogemoge12
pri_foo=hoge2
pri_bar=hogehoge2
sub_foo=moge21
sub_bar=mogemoge21
sub_foo=moge22
sub_bar=mogemoge22
sub_foo=moge23
sub_bar=mogemoge23

*1:コンパイルされたテンプレートを見たら、foreachのfromは、ドット区切りの先頭部分だけをSmarty変数から探して来るみたい?