mirror of
https://github.com/dg/dibi.git
synced 2025-08-05 21:58:10 +02:00
Helpers::getSuggestion() better balance. Replacement is more expensive than insertion/deletion.
This commit is contained in:
@@ -141,10 +141,10 @@ class Helpers
|
|||||||
public static function getSuggestion(array $items, $value)
|
public static function getSuggestion(array $items, $value)
|
||||||
{
|
{
|
||||||
$best = NULL;
|
$best = NULL;
|
||||||
$min = (int) (strlen($value) / 4) + 2;
|
$min = (strlen($value) / 4 + 1) * 10 + .1;
|
||||||
foreach ($items as $item) {
|
foreach (array_unique($items, SORT_REGULAR) as $item) {
|
||||||
$item = is_object($item) ? $item->getName() : $item;
|
$item = is_object($item) ? $item->getName() : $item;
|
||||||
if (($len = levenshtein($item, $value)) > 0 && $len < $min) {
|
if (($len = levenshtein($item, $value, 10, 11, 10)) > 0 && $len < $min) {
|
||||||
$min = $len;
|
$min = $len;
|
||||||
$best = $item;
|
$best = $item;
|
||||||
}
|
}
|
||||||
|
36
tests/dibi/Helpers.getSuggestion().phpt
Normal file
36
tests/dibi/Helpers.getSuggestion().phpt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Dibi\Helpers;
|
||||||
|
use Tester\Assert;
|
||||||
|
|
||||||
|
require __DIR__ . '/bootstrap.php';
|
||||||
|
|
||||||
|
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion([], ''));
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion([], 'a'));
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion(['a'], 'a'));
|
||||||
|
Assert::same('a', Helpers::getSuggestion(['a', 'b'], ''));
|
||||||
|
Assert::same('b', Helpers::getSuggestion(['a', 'b'], 'a')); // ignore 100% match
|
||||||
|
Assert::same('a1', Helpers::getSuggestion(['a1', 'a2'], 'a')); // take first
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion(['aaa', 'bbb'], 'a'));
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion(['aaa', 'bbb'], 'ab'));
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion(['aaa', 'bbb'], 'abc'));
|
||||||
|
Assert::same('bar', Helpers::getSuggestion(['foo', 'bar', 'baz'], 'baz'));
|
||||||
|
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'acbd'));
|
||||||
|
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'axbd'));
|
||||||
|
Assert::same(NULL, Helpers::getSuggestion(['abcd'], 'axyd'));
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
length allowed ins/del replacements
|
||||||
|
-------------------------------------
|
||||||
|
0 1 0
|
||||||
|
1 1 1
|
||||||
|
2 1 1
|
||||||
|
3 1 1
|
||||||
|
4 2 1
|
||||||
|
5 2 2
|
||||||
|
6 2 2
|
||||||
|
7 2 2
|
||||||
|
8 3 2
|
||||||
|
*/
|
Reference in New Issue
Block a user