Поиск похожих строк в массиве

Мне нужно использовать similar_text() для массива значений, которые выглядят примерно так:

$strings = ["lawyer" => 3, "business" => 3, "lawyers" => 1, "a" => 3];

Я пытаюсь найти слова, которые практически одинаковы, т.е. lawyer а также lawyers в приведенном выше массиве, и сложите их вместе в новом массиве.

Так lawyer было бы 4 как lawyers будет связан с исходной строкой lawyer,

Имейте в виду, что этот массив будет только когда-либо единичными словами, а длина не указана, она может варьироваться от 1 в >99,

Я понятия не имел, с чего начать, поэтому я дал трещину с циклом foreach, как вы увидите ниже, но ожидаемый результат не такой, как ожидалось.

foreach ( $strings as $key_one => $count_one ) {
foreach ( $strings as $key_two => $count_two ) {
similar_text($key_two, $key_one, $percent);
if ($percent > 80) {
if(!isset($counts[$key_one])) {
$counts[$key_one] = $count_one;
} else {
$counts[$key_one] += $count_two;
}
}
}
}

Замечания: Процент совпадения в 80 для этого примера (как совпадение для lawyer & lawyers является ~92%)

Что в итоге дает мне нечто похожее на следующее:

Array
(
[lawyer] => 4
[business] => 3
[a] => 3
[lawyers] => 2
)

Где мне это нужно:

Array
(
[lawyer] => 4
[business] => 3
[a] => 3
)

Обратите внимание, как я требую его практически удалить lawyers и добавить счет к lawyer,

0

Решение

Вы всегда можете использовать

unset( $counts[$key_two] ) ;
1

Другие решения

Ваша трудность в том, что юрист похож на юриста, а юрист похож на юриста. Таким образом, они оба увеличили их счет другим.

Попробуй это:

foreach ( $strings as $key_one => &$count_one ) {
if ($count_one == 0) continue; // skip it if we've already processed it
if (!isset($counts[$key_one]) {
$counts[$key_one] = $count_one;
$count_one = 0;
}
foreach ( $strings as $key_two => &$count_two ) {
similar_text($key_two, $key_one, $percent);
if ($percent > 80) {
$counts[$key_one] += $count_two;
$count_two = 0;
}
}
}

Недостатком этого является то, что вы изменяете свой исходный массив $ strings, который может быть не идеальным. Вот еще один подход, отслеживание уже обработанных строк в другом хеше:

$already = $counts = array(); // not really necessary, but nice to init
foreach ( $strings as $key_one => $count_one ) {
if (isset($already[$key_one])) continue; // skip if already processed
$counts[$key_one] = $count_one; // by definition this should be new
foreach ( $strings as $key_two => $count_two ) {
similar_text($key_two, $key_one, $percent);
if ($percent > 80) {
$counts[$key_one] += $count_two;
$already[$key_two] = true;
}
}
}

Я бы порекомендовал 2-е решение.

2

По вопросам рекламы [email protected]