Сортировка дерева
Опубликовано Isaev A. | Рубрика PHP | Размещено 06-05-2010
Метки: PHP, tree sort, Сортировка дерева
0
Решил написать небольшую функцию сортировки элементов дерева, для отображения всего дерева в развернутом виде. Почему решил написать статью – потому что в интернете ничего путного не нашел на эту тему.
На вход функции подается массив. Массив двухмерный В каждой строке первый элемент ID записи, второй parent (ID родителя). Вообщем стандартная структура для хранения деревьев. 3-й и последующие элементы строки любые значения, имя ветки например.
Попробую объяснить как это работает:
Берем первую строку массива и сравниваем по порядку id элемента с parent каждой записи до конца массива. Если они совпадают, то запись переносится из найденной позиции, под позицию первого элемента. Далее берем второй элемент и со второй позиции по порядку до конца, ищем совпадение передвигаем запись вверх под родителя.
Таким образом наше дерево как бы нарастает, сначала строится первый уровень , потом второй и так пока нарастать будет нечему.
function treesort ($arr) { for ($i=0;$i $flag=$i; for ($j=$i+1;$j if ($arr[$j][1]==$arr[$i][0]) { array_splice($arr,$flag+1,0,array(($arr[$j]))); unset($arr[$j+1]); $arr = array_values($arr); $flag=$flag+1; } } } return $arr; }
Пример исходной таблицы:
| id | parent | name |
| 1 | 0 | Group1 |
| 2 | 1 | Group2 |
| 3 | 1 | Group3 |
| 4 | 1 | Room 204 |
| 5 | 0 | Room 301 |
| 6 | 0 | Room 302 |
| 7 | 1 | Room 303 |
| 8 | 2 | Group4 |
| 9 | 2 | Room 401 |
| 10 | 3 | Room 402 |
| 11 | 8 | Room 12 |
Пример использования функции treesort на практике


