Пример рекурсивной функции, с помощью которой можно получить дерево из плоского массива.
/**
* Формирует дерево
* @param arr $items
* @param int $parentId
* @return arr
*/
public function tree($items, $parentId = 0) {
$tree = array();
foreach($items as $item) {
if ($item['parentId'] == $parentId) {
$tree[$item['id']] = $item;
$tree[$item['id']]['sub'] = $this->tree($items, $item['id']);
}
}
return $tree;
}
Лучше конечно использовать какой-нибудь алгоритм для хранения деревьев в бд. Их множество, один из них nested sets, как рекомендовали выше. Но выбор алгоритма должен исходить из условий конкретной задачи.