【问题标题】:How to call recursive function in smarty?如何在 smarty 中调用递归函数?
【发布时间】:2010-10-28 08:08:36
【问题描述】:
$sql = "select menu_id , menu_name , parent_id from menu " ;
$dbc->setFetchMode(DB_FETCHMODE_ASSOC);
$res = $dbc->query($sql);
while($row = $res->fetchRow()){
    $menu[$row['parent_id']][$row['menu_id']] = $row['menu_name'];
}

function make_menu($parent)
{
    global $menu ;
    echo '<ul>';
    foreach($parent as $menu_id=>$menu_name)
    {
        echo '<li>'.$menu_name ; 
        if(isset($menu[$menu_id]))
        {
            make_menu($menu[$menu_id]) ;
        }
        echo '</li>';
    }
    echo '</ul>';
}
$P['menu_bilder_data'] = $menu[0] ; 
//menu :off
$smarty->register_function('make_menu' , 'make_menu') ;

好的,我有这部分代码要检索并传递给 smarty。

我已将我的make_menu 函数注册为 smarty 的自定义用户函数,并且在模板中我有以下代码:

{make_menu parent_id=$P.menu_bilder_data}

我在索引文件中传递$P 数组。它必须工作,但它什么也没给我,因为它是一个递归函数,它返回一个数组而不是打印的嵌套 uls;我该如何解决这个问题?

【问题讨论】:

  • 我稍微整理了一下你的问题,但我对最后一段不太确定,你能仔细检查一下我没有搞砸吗?

标签: php recursion smarty


【解决方案1】:

问题

$Smarty->register_function() 和 {make_menu parent_id=$P.menu_bilder_data} 导致使用 ($params, &$smarty)
调用函数 其中 $params =

array(
  'parent_id' => array(
     0 => array(
       1 => > "menu item 1",
)

这不是函数所期望的数据结构。

解决方案

你可以不使用“register_function”来调用函数

{$P.menu_bilder_data|@make_menu}

管道“|”将 $P['menu_bilder_data'] 作为函数的第一个参数传递。而“@”使管道传递数组。如果没有“@”,将为数组中的所有元素调用该函数。

只是一个提示

将参数从$parent(它是一个数组)更改为$parent_id,所有菜单数据都可以从全局$menu中获得。

function make_menu($parent_id)
{      
  global $menu;
  if (!isset($menu[$parent_id])) {
     return;
  }
  $nodes = $menu[$parent_id];
  echo '<ul>';
  foreach($nodes as $menu_id => $menu_name)
  {
    echo '<li>'.$menu_name ; 
    make_menu($menu_id) ;
    echo '</li>';
  }
  echo '</ul>';
}

来自聪明人:

{0|make_menu}

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 2014-07-17
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多