Skip to content

Commit 0f22ac6

Browse files
committed
added Helpers::getSuggestion()
1 parent 98fe815 commit 0f22ac6

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

src/Utils/Helpers.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,22 @@ public static function falseToNull($val)
3535
{
3636
return $val === false ? null : $val;
3737
}
38+
39+
40+
/**
41+
* Finds the best suggestion (for 8-bit encoding).
42+
* @param string[] $possibilities
43+
*/
44+
public static function getSuggestion(array $possibilities, string $value): ?string
45+
{
46+
$best = null;
47+
$min = (strlen($value) / 4 + 1) * 10 + .1;
48+
foreach (array_unique($possibilities) as $item) {
49+
if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) < $min) {
50+
$min = $len;
51+
$best = $item;
52+
}
53+
}
54+
return $best;
55+
}
3856
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Utils\Helpers;
6+
use Tester\Assert;
7+
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
11+
12+
Assert::same(null, Helpers::getSuggestion([], ''));
13+
Assert::same(null, Helpers::getSuggestion([], 'a'));
14+
Assert::same(null, Helpers::getSuggestion(['a'], 'a'));
15+
Assert::same('a', Helpers::getSuggestion(['a', 'b'], ''));
16+
Assert::same('b', Helpers::getSuggestion(['a', 'b'], 'a')); // ignore 100% match
17+
Assert::same('a1', Helpers::getSuggestion(['a1', 'a2'], 'a')); // take first
18+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'a'));
19+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'ab'));
20+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'abc'));
21+
Assert::same('bar', Helpers::getSuggestion(['foo', 'bar', 'baz'], 'baz'));
22+
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'acbd'));
23+
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'axbd'));
24+
Assert::same(null, Helpers::getSuggestion(['abcd'], 'axyd')); // 'tags' vs 'this'
25+
Assert::same(null, Helpers::getSuggestion(['setItem'], 'item'));

0 commit comments

Comments
 (0)