Skip to content

Commit 8736bcb

Browse files
committed
added Helpers::getSuggestion()
1 parent c1db15e commit 8736bcb

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
@@ -32,4 +32,22 @@ public static function falseToNull($val)
3232
{
3333
return $val === false ? null : $val;
3434
}
35+
36+
37+
/**
38+
* Finds the best suggestion (for 8-bit encoding).
39+
* @param string[] $possibilities
40+
*/
41+
public static function getSuggestion(array $possibilities, string $value): ?string
42+
{
43+
$best = null;
44+
$min = (strlen($value) / 4 + 1) * 10 + .1;
45+
foreach (array_unique($possibilities) as $item) {
46+
if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) < $min) {
47+
$min = $len;
48+
$best = $item;
49+
}
50+
}
51+
return $best;
52+
}
3553
}
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)