Тривиальная часть состоит в том, чтобы разбить строки на слова и сравнить массивы по размеру. Если размер не совпадает, строки не могут быть одинаковыми:
function str_equals_ignore_word_order(string $str1, string $str2): bool
{
$words1 = explode(' ', $str1);
$words2 = explode(' ', $str2);
if (count($words1) !== count($words2)) {
return false;
}
// Here comes one of the following or already suggested solutions.
}
Установив это, мы имеем довольно много возможных решений для фактического сравнения двух массивов слов, которые, как ожидается, будут в другом порядке.
Уже предложил Nr. 1
Сортировка и сравнение (упрощенно без implode
):
sort($words1);
sort($words2);
return $words1 === $words2;
Это безопасно сделать и не изменит ввод, поскольку строки копируются, когда они передаются в функцию, и мы даже копировали строку в части при использовании explode
.
Создание словарей
Подсчет вхождений каждого слова и учет количества слов предотвращают проблемы, возникающие у других решений со словами, которые встречаются дважды во входных строках. Это решение также позволяет выбирать различные сравнения словарей:
$words1 = array_count_values($words1);
$words2 = array_count_values($words2);
// Comparison 1
$intersect = array_intersect_assoc($words1, $words2);
return count($intersect) === count($words1) && count($words1) === count($words2);
// Comparison 2
$diff = array_diff_assoc($words1, $words2);
return empty($diff);
Примечательна
Если ожидается, что ввод содержит орфографические ошибки, такие как два пробела сразу после другого ' '
, вы должны использовать array_filter($words1)
в обоих словарных массивах, чтобы убедиться, что ни NULL
слов не найдено.