Я считаю, что это целесообразно делать средствами PHP.
Предположим, что есть такие входные данные после полной выборки всех значений из базы данных (составлены на основе вашего примера):
// Предположим, что это корневой элемент
$arr[0]['id'] = 15;
$arr[0]['name'] = "name 1";
$arr[0]['parent'] = 0;
$arr[0]['order'] = 4;
$arr[1]['id'] = 16;
$arr[1]['name'] = "name 2";
$arr[1]['parent'] = 0;
$arr[1]['order'] = 2;
$arr[2]['id'] = 18;
$arr[2]['name'] = "name 3";
$arr[2]['parent'] = 16;
$arr[2]['order'] = 1;
$arr[3]['id'] = 19;
$arr[3]['name'] = "name 4";
$arr[3]['parent'] = 18;
$arr[3]['order'] = 3;
$arr[4]['id'] = 28;
$arr[4]['name'] = "name 5";
$arr[4]['parent'] = 15;
$arr[4]['order'] = 5;
$arr[5]['id'] = 31;
$arr[5]['name'] = "name 6";
$arr[5]['parent'] = 16;
$arr[5]['order'] = 6;
Напишем обработчик для вашей задачи:
// Функция-хелпер, сравнивающая элементы массива по ключу 'order'
function sortByOrder($a, $b) {
return $a['order'] - $b['order'];
}
// Функция, формирующая древовидный массив
function formTree($mess)
{
if (!is_array($mess)) {
return false;
}
$tree = array();
// Формируем древовидный массив вида:
// id элемента => потомки этого элемента
foreach ($mess as $value) {
$tree[$value['parent']][] = $value;
}
// Сортитуем потомков по ключу 'order' в порядке возрастания
foreach ($tree as $key => $branch) {
usort($branch, 'sortByOrder');
$tree[$key] = $branch;
}
return $tree;
}
// Функция, формирующая html-представление древовидного массива
// Элемент с ключом $parent будет считаться "корневым"
function buildTree($cats, $parent)
{
// Если передан массив и в нем есть
if (is_array($cats) && isset($cats[$parent])) {
$tree = '<ul>';
foreach ($cats[$parent] as $cat) {
$tree .= '<li>' . $cat['id'];
$tree .= buildTree($cats, $cat['id']);
$tree .= '</li>';
}
$tree .= '</ul>';
} else {
return false;
}
return $tree;
}
// Сформированный и отсортированный древовидный массив
$tree = formTree($arr);
// Сформированное html-представление древовидного массива
$html_tree = buildTree($tree, 0);
Результат работы:
