Библиотека для cis, online, cms1
This commit is contained in:
commit
3c2e614d87
269 changed files with 39854 additions and 0 deletions
79
core/tree/sort.php
Normal file
79
core/tree/sort.php
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue