// build a map tid->term
foreach ($terms as &$term) {
$tree[$term->tid] = &$term;
}
// add child links to every node
foreach ($terms as &$term) {
foreach ($term->parents as $parent) {
if ($parent != 0) {
$tree[$parent]->children[] = &$term;
}
}
}
// remove non-root terms
foreach ($tree as $tid => &$term) {
if ($term->parents[0] == 0) {
$final_tree[$tid] = $term;
}
}