SortsObjectsCollection::getRanks()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 3
c 1
b 0
f 0
nc 4
nop 2
dl 0
loc 6
ccs 0
cts 4
cp 0
crap 12
rs 10
1
<?php
2
3
namespace Terranet\Administrator\Traits;
4
5
use Illuminate\Contracts\Support\Arrayable;
6
7
trait SortsObjectsCollection
8
{
9
    /**
10
     * Sort collection of objects by order or class name.
11
     *
12
     * @param $objects
13
     *
14
     * @return array
15
     */
16
    protected function sortCollection($objects)
17
    {
18
        $class = false;
19
20
        if ($objects instanceof Arrayable) {
21
            $class = \get_class($objects);
22
23
            $objects = $objects->toArray();
24
        }
25
26
        usort($objects, function ($aObj, $bObj) {
27
            [$aRank, $bRank] = $this->getRanks($aObj, $bObj);
28
29
            if ($this->equals($aRank, $bRank)) {
30
                return $this->sortByName($aObj, $bObj);
31
            }
32
33
            return $this->sortByValue($aRank, $bRank);
34
        });
35
36
        return $class ? $class::make($objects) : $objects;
37
    }
38
39
    /**
40
     * @param $aRank
41
     * @param $bRank
42
     *
43
     * @return bool
44
     */
45
    protected function equals($aRank, $bRank)
46
    {
47
        return $aRank === $bRank;
48
    }
49
50
    /**
51
     * @param $aObj
52
     * @param $bObj
53
     *
54
     * @return int
55
     */
56
    protected function sortByName($aObj, $bObj)
57
    {
58
        $aName = class_basename($aObj);
59
        $bName = class_basename($bObj);
60
61
        return $aName < $bName ? -1 : 1;
62
    }
63
64
    /**
65
     * @param $aRank
66
     * @param $bRank
67
     *
68
     * @return int
69
     */
70
    protected function sortByValue($aRank, $bRank)
71
    {
72
        return $aRank < $bRank ? -1 : 1;
73
    }
74
75
    protected function getRanks($aObj, $bObj)
76
    {
77
        $aRank = method_exists($aObj, 'order') ? $aObj->order() : 10;
78
        $bRank = method_exists($bObj, 'order') ? $bObj->order() : 10;
79
80
        return [$aRank, $bRank];
81
    }
82
}
83