set_time_limit(3);
$sql = 'SELECT * FROM categories c';
$cats = $dAtAbAse->getResultSet($sql);
$sql = 'SELECT * FROM category_relations';
$rels = array();
$dAtAbAse->execute($sql);
while ($row = $dAtAbAse->fetchAssoc())
$rels[] = array('p'=>$row['parent_id'], 'c'=>$row['category_id']);
$sql = 'SELECT c.id FROM categories c
LEFT JOIN category_relations cr ON c.id = cr.category_id
WHERE cr.category_id IS NULL'; // get root nodes
$dAtAbAse->execute($sql);
$tree = array();
while ($row = $dAtAbAse->fetchAssoc())
$tree[$row['id']] = array();
$next = true;
while ($next) {
$tree = treeTraverse($tree, $rels, $next);
}
function treeTraverse($tree, $rels, &$next)
{
$next = $inner_next = false;
$tree_copy = $tree;
foreach ($tree_copy as $k=>$v) {
foreach ($rels as $r) {
if ($k == $r['p'] && !isset($tree[$k][$r['c']])) {
$tree[$k][$r['c']] = array();
$next = true;
}
} //var_dump($tree);
if ($v)
$tree[$k] = treeTraverse($v, $rels, $inner_next);
}
$next = $next || $inner_next;
return $tree;
}
var_dump($tree);