Все, что возвращается функцией smarty, напрямую выводится, .tpl никогда не получает массив, только строковое значение "Array". Прошло много времени с тех пор, как я использовал Smarty, поэтому это могло измениться, но я считаю, что стандартный способ сделать это так:
function smarty_function_arraytest($params, $template)
{
// check $params['out'] exists here
$array = array("1"=>array("categories"=>"Action"));
$template->assign($params['out'], $array);
}
тогда назовите это как:
{arraytest out="arraytestValues"}
{foreach from=$arraytestValues key=k item=v}
<p>{$k}: {$v}</p>
{/foreach}
конечно, потому что у вас есть многомерный массив, вам нужно дважды зациклить его:
{arraytest out="arraytestValues"}
{foreach from=$arraytestValues key=k item=v}
<p>{$k}: {$v}</p>
{foreach from=$v key=sk item=sv}
<p>{$sk}: {$sv}</p>
{/foreach}
{/foreach}