我想知道是否有一种方法可以通过某些PHP方法进行比较,并验证两个链(无论顺序如何)都是相同的,
例如:
$string1 = "Pedro Perez";
$string2 = "Perez Pedro";
所以我的问题是,如何比较这个TRUE
。显然,您的订单与众不同。
我问这个问题是因为我正在开发一个搜索,并且我希望$string1
和$string2
的比较取相同的值,而不管它们的顺序如何,只要字符串具有相同的单词
答案 0 :(得分:7)
您将其按空间爆炸并按如下所示将两个数组相交并检查其计数
$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);
工作demo。
答案 1 :(得分:2)
另一种方法
$string1 = "Pedro Perez";
$string2 = "Perez Pedro";
$s1 = explode(" ", $string1);
$s2 = explode(" ", $string2);
$comp = empty( array_diff($s1, $s2) ) ? true : false;
答案 2 :(得分:2)
琐碎的部分是将字符串分成单词,然后按大小比较数组。如果大小不同,则字符串不能相同:
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.
}
建立后,我们有很多可能的解决方案可以对两个单词数组进行实际比较,而这两个单词的排列顺序应该不同。
排序并比较(简化后没有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
个单词被匹配。 / p>
答案 3 :(得分:1)
您可以尝试这样做。
简单的方法,您就可以...
<?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);
?>
答案 4 :(得分:0)
一个有趣的简短功能,在必要时不进行排序。
// 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;
};