PHP找到叶子和构建树的父母

时间:2014-08-11 14:48:22

标签: php arrays multidimensional-array tree

我有一个非常简单的任务,但我失去了某个地方。我有具有共同结构的类别表:id,id_parent,其他一些不太重要的字段。我需要构建从父节点到子节点的多维数组,如下所示:

array(
    'id' => 1,
    'id_parent' => 0,
    'name' => 'Main', 
    'children' => array(
        'id' => 2,
        'id_parent' => 1,
        'name' => 'Main-sub',
        'children' => array(
            'id' => 3,
            'id_parent' => 2,
            'name' => 'Main-sub-sub'
        )
    )
)

我已经给出了类别ID(例如id = 3)。我需要找到此类别的第一个父级,然后构建遍历的树。我尝试使用if语句递归的最简单的方法,但我得到的数组的顺序是相反的。这就是现在的样子:

public function getCategoryById($id)
{
    $branch = array();
    $data = $this -> db -> query("SELECT categories.* FROM categories WHERE categories.visible = 1 AND categories.id = {$id} ORDER BY categories.position -- LIMIT 1");
    if(is_array($data))
    {
        foreach($data as $item)
        {
            if($item['id_parent'] != 0)
            {
                // do it again recursively
                $parent = $this -> getCategoryById($item['id_parent']);
                $branch['parents'] = $parent;
                // lost here
            }
            // lost here also
            $branch[] = $item;
        }
    }
    return $branch;
}

我搜索了线程,发现了几个类似于我的问题,但解决方案在我的情况下不起作用。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您最好使用一个函数来查找给定ID的类别的所有子项并返回您要查找的结构。

public function getChildrenForCategory($id)
{
  $children = array();
  $data = $this -> db -> query("SELECT categories.* FROM categories WHERE categories.visible = 1 AND categories.id_parent = {$id} ORDER BY categories.position");
  if(is_array($data))
  {
    foreach($data as $item)
    {
        // do it again recursively
        $subChildren = $this -> getChildrenForCategory($item['id']);
        $item['children'] = $subChildren;
        array_push($children, $item);
    }
  }
  return $children;
}