>source

일부 PHP 방법으로 비교할 수있는 방법이 있는지 알고 순서에 관계없이 두 체인이 동일한 지 확인하고 싶습니다

예 :

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

그래서 내 질문은 어떻게이 TRUE 를 만들 수 있습니까  비교. 분명히, 당신의 주문은 그것을 다르게 만듭니다.

<시간>

검색을 개발하고 있기 때문에이 질문을하고 $string1 를 비교하고 싶습니다  그리고 $string2  문자열에 같은 단어가있는 한 순서에 관계없이 동일한 값으로 간주됩니다


  • 답변 # 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);
      ?>
      
      

  • 답변 # 2

    공간으로 분해하고 다음과 같이 두 배열을 교차시키고 개수를 확인합니다

    $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);
    
    

    작업 데모.

  • 답변 # 3

    아직 다른 접근법

    $string1 = "Pedro Perez";
    $string2 = "Perez Pedro";
    $s1 = explode(" ", $string1);
    $s2 = explode(" ", $string2);
    $comp = empty( array_diff($s1, $s2) ) ? true : false;
    
    

  • 답변 # 4

    사소한 부분은 문자열을 단어로 나누고 배열을 크기별로 비교하는 것입니다. 크기가 같지 않으면 문자열이 같을 수 없습니다 :

    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 가 없도록 두 단어 배열  단어가 일치합니다.

  • 답변 # 5

    재미있는 재미있는 기능으로, 필요한 경우 정렬되지 않습니다.

    분할 된 문자열 단어 개수 비교

    정렬 단어 배열

    단어 배열을 비교합니다.

    // 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;
    };
    
    

관련 자료

  • 이전 python - 파티션에서 실행 된 함수를 디버그하기 위해 print 문을 사용하는 방법
  • 다음 Tensorflow REST API를 사용하여 객체 감지에서 요청 JSON을 올바르게 빌드하는 방법은 무엇입니까?