Php 如何将生成HTML并在同一函数中进行递归求和的代码解耦?

Php 如何将生成HTML并在同一函数中进行递归求和的代码解耦?,php,recursion,refactoring,decoupling,Php,Recursion,Refactoring,Decoupling,我遇到了以下代码。它打印出HTML(使用ZF2的partial函数),同时递归地计算所有项目的总计 function gen_items($parentId) { $total = 0; $rows = $this->db->getData($parentId); //DB call! foreach($rows as $row) { $id = $row['id'] $price = $row['price'];

我遇到了以下代码。它打印出HTML(使用ZF2的
partial
函数),同时递归地计算所有项目的总计

function gen_items($parentId)
{
    $total = 0;
    $rows = $this->db->getData($parentId); //DB call!
    foreach($rows as $row)
    {
        $id = $row['id']
        $price = $row['price'];

        echo $this->partial('item.phtml', array('price'=> $price));

        $total += $price + $this->gen_items($id);
    }

    return $total;
}
首先,我认为这是一个问题,因为名称
gen_items
对于为行项目生成HTML代码是有意义的,但是对于它来说,求和是没有意义的

我的一个想法是制作一个重复的函数,除了一个用于HTML生成,一个用于求和之外,它可以做所有相同的事情

问题

我怎样才能使它解耦?在不创建两个复制所有递归DB调用的函数的情况下,是否可以这样做

有关DB的更多详细信息

数据库结构:表(id、价格)<当没有父项时,代码>id==-1。否则,
id
指向父
id


行数-例如平均约5-10个父项,每个项总共有1到6个子项(其中一些可能是大约3个子项,其自身有一个子项)

我正在寻求一个解决方案:

  • 递归读取数据库
  • 在PHP结构中累积从DB读取的行
  • 以一个漂亮的数组将该结构返回给调用方
来电者比

  • 运行迭代算法,分别使用数组和中的值打印HTML
  • 汇总定价信息

---编写后可能添加的代码--

(基本上是一样的,但不是$total,而是累积$childRows)

也许要补充一点——我首先要使它解耦吗。应该吗?看起来您正在查询要开始的行中的信息。为什么不在该查询中包含一些SQL来获取价格的总和呢?可能需要更多信息。。。。我不太熟悉构造递归计算和、递归提取行数据的SQL查询。。。。另外,我还需要单独的行项目数据。如果你想做一些研究,在这个主题上有一个问题。我担心在这种情况下,这可能有点远,但请让我知道:我也可以调用此函数
sum\u item\u prices
,而不是将其解耦,其副作用是以HTML打印行项目,并保持原样,记录副作用。