StringComparator::findSimilarText()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.7998
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace Facade\Ignition\Support;
4
5
use Illuminate\Support\Collection;
6
7
class StringComparator
8
{
9
    public static function findClosestMatch(array $strings, string $input, int $sensitivity = 4): ?string
10
    {
11
        $closestDistance = -1;
12
        $closestMatch = null;
13
14
        foreach ($strings as $string) {
15
            $levenshteinDistance = levenshtein($input, $string);
16
17
            if ($levenshteinDistance === 0) {
18
                $closestMatch = $string;
19
                $closestDistance = 0;
20
21
                break;
22
            }
23
24
            if ($levenshteinDistance <= $closestDistance || $closestDistance < 0) {
25
                $closestMatch = $string;
26
                $closestDistance = $levenshteinDistance;
27
            }
28
        }
29
30
        if ($closestDistance <= $sensitivity) {
31
            return $closestMatch;
32
        }
33
34
        return null;
35
    }
36
37
    public static function findSimilarText(array $strings, string $input): ?string
38
    {
39
        if (empty($strings)) {
40
            return null;
41
        }
42
43
        return Collection::make($strings)
44
            ->sortByDesc(function (string $string) use ($input) {
45
                similar_text($input, $string, $percentage);
46
47
                return $percentage;
48
            })
49
            ->first();
50
    }
51
}
52