79 lines
2.4 KiB
PHP
79 lines
2.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Ñîðòèðîâêà äåðåâà â ïðåäñòàâëåíèè Nested Set
|
|
* Äëÿ äåðåâà êîòîðîå õðàíèòñÿ â áàçå äàííûõ èñïîëüçóÿ ïðåäñòàâëåíèå Nested Set íåò âîçìîæíîñòè îòñîðòèðîâàòü ýëåìåíòû äåðåâà ïî
|
|
* ïðîèçâîëüíîìó ïîëþ. Ïîýòîìó ïîñëå èçâëå÷åíèÿ äåðåâà èç áàçû äàííûõ îíî ïðåîáðàçóåòñÿ â îáû÷íîå ïðåäñòàâëåíèå ñîðòèðóåòñÿ è îáðàòíî
|
|
*
|
|
* Ïðèìåð:
|
|
* $sort = new NestedSetSort();
|
|
* $data = $sort->sortBy($data, 'name');
|
|
*/
|
|
class NestedSetSort {
|
|
private $data = array();
|
|
private $result = array();
|
|
private $sortBy = '';
|
|
|
|
public function __construct() {
|
|
}
|
|
|
|
// Ïðåîáðàçóåì Nested Set â äåðåâî è ñîðòèðóåì
|
|
private function listTree(array $tree, $offset, $level) {
|
|
$result = array();
|
|
for ($i = $offset; $i < sizeof($tree); $i++) {
|
|
$leaf = $tree[$i];
|
|
$clevel = $leaf['cat_level'];
|
|
if ($clevel == $level) {
|
|
$result [] = array($i);
|
|
} else if ($clevel > $level) {
|
|
list($subtree, $i) = $this->listTree($tree, $i, $clevel);
|
|
$i--;
|
|
$result[sizeof($result) - 1][1] = $subtree;
|
|
} else {
|
|
$this->sortList($result, $tree);
|
|
return array($result, $i);
|
|
}
|
|
}
|
|
$this->sortList($result, $tree);
|
|
return array($result, $i);
|
|
}
|
|
|
|
// Ñðàâíåíèå äâóõ ýëåìåíòîâ
|
|
private function compare($a, $b) {
|
|
$a1 = $this->data[$a[0]][$this->sortBy];
|
|
$b1 = $this->data[$b[0]][$this->sortBy];
|
|
return strcmp($a1, $b1);
|
|
}
|
|
|
|
// Ñîðòèðîâêà ñïèñêà
|
|
private function sortList(array &$list, $data) {
|
|
usort($list, array($this, 'compare'));
|
|
}
|
|
|
|
// Ñîçäàåò äåðåâî â âèäå ñïèñêà
|
|
private function reorder(array $tree) {
|
|
foreach($tree as $node) {
|
|
$this->result[] = $this->data[$node[0]];
|
|
if (isset($node[1])) {
|
|
$this->reorder($node[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function sortBy0(array $data, $sortBy)
|
|
{
|
|
$this->data = $data;
|
|
$this->sortBy = $sortBy;
|
|
$order = $this->listTree($data, 0, 0);
|
|
return $order[0];
|
|
}
|
|
|
|
// Ñîðòèðîâêà ïî çàäàííîìó ïîëþ
|
|
public function sortBy(array $data, $sortBy) {
|
|
$this->data = $data;
|
|
$this->sortBy = $sortBy;
|
|
$order = $this->listTree($data, 0, 0);
|
|
$this->reorder($order[0]);
|
|
return $this->result;
|
|
}
|
|
}
|