1
|
|
|
<?php
|
2
|
|
|
namespace Sonar\Common;
|
3
|
|
|
use Exception;
|
4
|
|
|
|
5
|
|
|
trait TreeStructureTrait
|
6
|
|
|
{
|
7
|
|
|
protected $tree;
|
8
|
|
|
|
9
|
2 |
|
public function getTree()
|
10
|
|
|
{
|
11
|
2 |
|
return $this->tree;
|
12
|
|
|
}
|
13
|
1 |
|
public function initTree()
|
14
|
|
|
{
|
15
|
1 |
|
$this->tree = [];
|
16
|
1 |
|
}
|
17
|
8 |
|
public function addTreeStructure($data)
|
18
|
|
|
{
|
19
|
8 |
|
$tree = isset($this->tree) ? $this->tree : [];
|
20
|
|
|
|
21
|
8 |
|
foreach ($data as $rec) {
|
22
|
8 |
|
if (is_object($rec) === false) {
|
23
|
1 |
|
throw new Exception('data record must be object.');
|
24
|
|
|
}
|
25
|
7 |
|
if (isset($rec->id) === false) {
|
26
|
2 |
|
throw new Exception('data record object does not have property => "id".');
|
27
|
|
|
}
|
28
|
6 |
|
if (isset($rec->parent_id) === false || ! $rec->parent_id) {
|
29
|
6 |
|
$rec->children = [];
|
30
|
6 |
|
$tree[$rec->id] = $rec;
|
31
|
6 |
|
} else {
|
32
|
5 |
|
$this->addTree($tree, $rec);
|
33
|
|
|
}
|
34
|
6 |
|
}
|
35
|
6 |
|
$this->tree = $tree;
|
36
|
6 |
|
}
|
37
|
5 |
|
protected function addTree(&$tree, $data)
|
38
|
|
|
{
|
39
|
5 |
|
foreach ($tree as $id => &$rec) {
|
40
|
5 |
|
if ($data->parent_id == $id) {
|
41
|
5 |
|
$data->children = [];
|
42
|
5 |
|
$rec->children[$data->id] = $data;
|
43
|
5 |
|
return;
|
44
|
5 |
|
} elseif (count($rec->children)) {
|
45
|
5 |
|
$this->addTree($rec->children, $data);
|
46
|
5 |
|
}
|
47
|
5 |
|
unset($rec);
|
48
|
5 |
|
}
|
49
|
5 |
|
}
|
50
|
4 |
|
public function mergeCount($count_data)
|
51
|
|
|
{
|
52
|
4 |
|
$tree = isset($this->tree) ? $this->tree : [];
|
53
|
4 |
|
foreach ($tree as &$rec) {
|
54
|
4 |
|
foreach ($count_data as $count) {
|
55
|
4 |
|
if (isset($count->id) === false) {
|
56
|
2 |
|
throw new Exception('count data record object does not have property => "id".');
|
57
|
|
|
}
|
58
|
2 |
|
if (isset($count->count) === false) {
|
59
|
1 |
|
throw new Exception('count data record object does not have property => "count".');
|
60
|
|
|
}
|
61
|
1 |
|
if ($rec->id == $count->id) {
|
62
|
1 |
|
$rec->count = $count->count;
|
63
|
1 |
|
}
|
64
|
1 |
|
}
|
65
|
1 |
|
}
|
66
|
1 |
|
$this->tree = $tree;
|
67
|
1 |
|
}
|
68
|
|
|
}
|
69
|
|
|
|