У вас будет структура вроде той, что ниже, у которой subitems это массив элементов этой же структуры. В data храните полезную нагрузку для узла (в вашем случае user_id, L, R):
array(
'id' => ...,
'data' => array(...),
'subitems' => array(...)
)
Заводите индексный массив ссылок $node_index = array(); и массив результатов $result = array();
Сортируете исходный массив по возрастанию level, после чего делаете что-то вроде:
foreach($node in $source_array) {
if(!($parent_node = $node_index[$node['previous_id']])) {
$result[$node['previous_id']] = array(
'id' => $node['previous_id'],
'data' => array(...),
'subitems' => array()
);
$node_index = &$result[$node['previous_id']];
$parent_node = $node_index[$node['previous_id']];
}
$parent_node['subitems'][$node['id']] = $node;
$node_index[$node['id']] = &$parent_node['subitems'][$node['id']];
}
Не могу утверждать, что код 100% рабочий, написал по памяти. Суть его в том, что $node_index является хэшем id ноды => ссылка на нее. Без этого массива пришлось бы мудрить рекурсию для того, чтобы распихать элементы по иерархии.
В результате у вас получится иерархический массив, обойдя который рекурсивно вы сможете его визуализировать.
А если совсем по-хорошему, то лучше какое-нибудь готовое дерево использовать. Это так, dirty hack, не более.