Библиотека для cis, online, cms1

This commit is contained in:
Фёдор Подлеснов 2016-06-29 18:51:32 +03:00
commit 3c2e614d87
269 changed files with 39854 additions and 0 deletions

79
core/tree/sort.php Normal file
View 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;
}
}