从数据库中获取子项目并显示它们的良好实践方法

时间:2012-01-20 16:49:56

标签: php algorithm

我有一个项目列表。每个项目都有子列表。它有点像StackOverflow上的答案,其中每个答案都有一个0-n子语句列表。

我正在使用PHP脚本,并且我能够在一个查询中查询所有注释和子注释,但很难组织数据以便正确显示。

我遇到的困难是获取所有主要评论,然后汇总其下的所有子评论,然后动态确定何时放置表单以添加额外的子评论。

知道如何以一种或多或少的优雅或良好实践的方式做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:1)

当遇到这个问题时,我通常会从我的查询中构建两个数组:一个主要注释,然后是所有子注释中的一个。然后我遍历主要注释并使用一些相关的键在它们出现时拉入子注释。它不是很好,因为o(n ^ 2)但对于小型工作来说并不是什么大问题。

答案 1 :(得分:1)

我发现与我“坐在一起”的唯一方法是将数据库中的所有内容读入DOMDocument以将其转换为XML - 然后您可以使用标准DOM导航技术遍历节点(如果您只想在URL中传递当前查看的“页面”的ID),则非常有用。

例如,您可以从列表中的最后一个节点开始,然后“向上”列表,直到'parent_id'(例如)== 0;

答案 2 :(得分:1)

如果每个项目都有parent_id,那么使用引用很容易

我的代码示例

/**
    * array for storing data
    *
    * @var array
    */
private $tree = array();
   /**
    * html - output of current module
    *
    * @var string
    */
    private $output = ''; 

  /**
   * Retreives data from table items.
   *
   * @return void
   */
    private function _getData()
{
    $pdo = App_Registry::get('pdo');
    $levels = array();
    foreach ($pdo->query('SELECT * FROM sellers ORDER BY parent_id ASC',PDO::FETCH_OBJ) as $k=>$v){
               //tree with references references
         $current =  &$levels[ $v->id ] ;
             $current['parent_id'] = $v->parent_id;
             $current['name'] = $v->name;
             if (0 == $v->parent_id){
             $this->tree[ $v->id ] = &$current;
             } else {
         $levels[$v->parent_id ]['children'][$v->id] = &$current;
             }
    }
}   

/*
*App_AbstractModule::preRender overriding
    * @return void
*/
protected  function preRender()
{
    $this->_getData();
    }
  /**
   * recursively build html output.
   *
   * @return string
   */
private function _render($arr)
{
    $this->output.= '<ul>';
    foreach ($arr as $k=>$v)
    {
        $this->output.= '<li>'.$v['name'].'</li>';
        if( !empty($v['children'])){
            $this->_render($v['children']);
        }
    }
    $this->output.= '</ul>';
    return $this->output;
}
/*
*App_AbstractModule::render overriding
    * @return string
*/
protected  function render()
{
        return $this->_render($this->tree);
}

}

表格下一步

   id   parent_id   name
    1   0   Dave Brubeck
    2   0   Ahmad Jamal
    3   0   Art Blacky
    4   0   Roy Hargrov
    5   2   Miles Davis
    6   1   Richie Cole
    7   2   Dizzy Gillespie
    8   5   Joshua Redman
    9   1   Michel Petrucciani