Выборка комментариев с одним вложенным уровнем

sanu0074

Новичок
Должно получиться дерево вида:
Код:
array(5){
  [1]=>array(99){
      'field'=>'...',
      'field'=>'...',
      'field'=>'...',
            .............
      //если есть у него p_id (родительский коммент), то создается вложенный массив 'childs'
      'childs'=array(99){   
              'field'=>'...',
              'field'=>'...',
              // и тд..
      }
  }
}
Но у меня получается такое
Код:
array(4) {
  [1]=>
  array(14) {
    ["id"]=>
    string(1) "5"
    ["section"]=>
    string(5) "match"
    ["el_id"]=>
    string(3) "773"
    ["p_id"]=>
    string(1) "0"
    ["avt_id"]=>
    string(4) "8189"
    ["adr_id"]=>
    NULL
  }
  [2]=>
  array(14) {
    ["id"]=>
    string(1) "4"
    ["section"]=>
    string(5) "match"
    ["el_id"]=>
    string(3) "773"
    ["p_id"]=>
    string(1) "0"
    ["avt_id"]=>
    string(4) "8189"
    ["adr_id"]=>
    NULL
  }
  [3]=>
  array(14) {
    ["id"]=>
    string(1) "3"
    ["section"]=>
    string(5) "match"
    ["el_id"]=>
    string(3) "773"
    ["p_id"]=>
    string(1) "0"
    ["avt_id"]=>
    string(4) "8189"
    ["adr_id"]=>
    NULL
  }
  [5]=>
  array(1) {
    ["childs"]=>
    array(1) {
      [0]=>
      array(14) {
        ["id"]=>
        string(1) "6"
        ["section"]=>
        string(5) "match"
        ["el_id"]=>
        string(3) "773"
        ["p_id"]=>
        string(1) "5"
        ["avt_id"]=>
        string(4) "8189"
        ["adr_id"]=>
        string(4) "9898"
      }
    }
  }
}
Выборку и сортировку делаю так:
PHP:
    public function getFromEl($id){
        $sql  = "SELECT c.*,"
                . "u.login AS avt_login,u.opt_avatar AS avt_ava, "
                . "u2.login AS adr_login,u2.opt_avatar AS adr_ava "
                . "FROM comments c "
              . "LEFT JOIN users u ON u.id=c.avt_id "
              . "LEFT JOIN users u2 ON u2.id=c.adr_id "
              . "WHERE c.el_id=$id ORDER BY c.date_create DESC";
        $q = $this->user->dbh->query($sql);
        $r = $q->fetchAll(PDO::FETCH_ASSOC);
        if(count($r)>0){
            return $this->mapTree($r);
        }
        return NULL;
    }

    private function mapTree($dataset) {
        $tree = array();
        foreach ($dataset as $id=>&$node) {
            if (!$node['p_id']) {
                $tree[$id] = &$node;
            } else {
                $dataset[$node['p_id']]['childs'][$id] = &$node;
            }
        }
        return $tree;
    }
Так же еще получаю "Undefined index: p_id" в строке: $dataset[$node['p_id']]['childs'][$id] = &$node;
Помогите разобраться!
p.s. скрин структуры таблицы
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
caliostro, консультируем здесь, чтобы всем было видно ;)
 

sanu0074

Новичок
уже решено
PHP:
    private function mapTree($arr, $id_key = 'id', $pid_key = 'p_id') {
        $structure = array();
        while ($elem = array_shift($arr)) {
            if (isset($structure[$elem[$id_key]])) {
                $elem['childs'] = $structure[$elem[$id_key]];
                unset($structure[$elem[$id_key]]);
            } else
                $elem['childs'] = array();
            if (isset($references[$elem[$pid_key]])) {
                $references[$elem[$pid_key]]['childs'][$elem[$id_key]] = $elem;
                $references[$elem[$id_key]] = & $references[$elem[$pid_key]]['childs'][$elem[$id_key]];
            } else {
                $structure[$elem[$pid_key]][$elem[$id_key]] = $elem;
                $references[$elem[$id_key]] = & $structure[$elem[$pid_key]][$elem[$id_key]];
            }
            asort($references);
        }
        return $structure;
    }
 
Сверху