Сравнение строк независимо от порядка PHP - PullRequest
1 голос
/ 13 мая 2019

Я хочу знать, существует ли способ сравнения с помощью какого-либо метода PHP, и убедиться, что две цепочки независимо от порядка одинаковы,

например:

$string1 = "Pedro Perez";
$string2 = "Perez Pedro";

Итак, мой вопрос, как я могу сделать это TRUE в сравнении. Ясно, что ваш заказ отличает его.


Я задаю этот вопрос, потому что я разрабатываю поиск, и я хочу, чтобы сравнение $string1 и $string2 принималось за одно и то же значение, независимо от того, в каком порядке они находятся, если строка имеет одинаковый слова

Ответы [ 5 ]

6 голосов
/ 13 мая 2019

Вы разбиваете его на пробел и пересекаете оба массива следующим образом и проверяете его количество

$string1 = "Pedro Perez";
$string2 = "Perez Pedro";
$s1 = array_unique(explode(" ", $string1));
$s2 = array_unique(explode(" ", $string2));
$temp = array_intersect($s1, $s2);
var_dump(count($temp) == count($s1) && count($temp) == count($s2));

РЕДАКТИРОВАТЬ

Для более чем двух слов здесь есть фрагмент,

$string1 = "Perez Perez Pedro";
$string2 = "Perez Pedro Perez";
list($s1,$s2) = [explode(" ", $string1), explode(" ", $string2)];
sort($s1);sort($s2);
var_dump($s1 === $s2);

Рабочая демо .

2 голосов
/ 13 мая 2019

Тривиальная часть состоит в том, чтобы разбить строки на слова и сравнить массивы по размеру. Если размер не совпадает, строки не могут быть одинаковыми:

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 слов не найдено.

2 голосов
/ 13 мая 2019

Еще один подход

$string1 = "Pedro Perez";
$string2 = "Perez Pedro";
$s1 = explode(" ", $string1);
$s2 = explode(" ", $string2);
$comp = empty( array_diff($s1, $s2) ) ? true : false;
0 голосов
/ 14 мая 2019

Короткая функция для удовольствия, которая не сортирует при необходимости.

  • Сравнить количество слов в разбитой строке,
  • сортировать массивы слов,
  • сравнить массивы слов.
// Split the sentences, compare word count, sort words, compare sorted words
function compare_words($a, $b) { 
  return count($a = explode(' ', $a)) == count($b = explode(' ', $b)) 
    && sort($a) 
    && sort($b) 
    && $a === $b;
};
0 голосов
/ 13 мая 2019

Вы можете попробовать сделать это.

  1. Преобразовать строку в массив, разделив пробелы.
  2. Сортировать массив.
  3. Преобразовать обратно массив встрока.
  4. Сравните оба.

Проще говоря, вот и все ...

<?php
  $string1 = "Pedro Perez";
  $string2 = "Perez Pedro";
  $string1 = explode(" ", $string1);
  $string2 = explode(" ", $string2);
  // Update: You don't save the output of sort, as it's by reference.
  sort($string1);
  sort($string2);
  $string1 = implode(" ", $string1);
  $string2 = implode(" ", $string2);
  var_dump($string1 === $string2);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...