Функция конечно не работает
Жуткий говнокод, конечно. Но уровень вложенности считает правильно.
Если нужно выводить в другом порядке, то можно вместо вывода сохранять результат по id в массив (например, гонять его по ссылке третьим параметром), ksort и вывести.
Хотя правильнее создать в таблице новое поле level, заполнить его и потом выводить без всякой рекурсии.