読者です 読者をやめる 読者になる 読者になる

B-Teck!

お仕事からゲームまで幅広く

【PHP】2つの文字列を比較して差異の数を取得する

2つの文字列から、長さの差も含めて差異のある文字数を取得するメソッド

str_splitのマルチバイト対応版がないので、

<?php
preg_split("//u", $i_str1, -1, PREG_SPLIT_NO_EMPTY);

で文字列を一文字ずつの配列にバラして、ループで比較する。

  

<?php
        /**
         *  2つの文字列に差異が何文字あるかを取得
         *
         * @access public
         * @param  string $i_str1 文字列1
         * @param  string $i_str2 文字列2
         * @return int    $failCount 差異のあった文字数
         */
        function checkDiffString($i_str1, $i_str2){
            //文字の長さを取得
            $strLength1 = mb_strlen($i_str1);
            $strLength2 = mb_strlen($i_str2);
            //比較する文字数を取得
            $compLength = min($strLength1, $strLength2);
            
            //文字列を配列に変換
            $aryStr1 = preg_split("//u", $i_str1, -1, PREG_SPLIT_NO_EMPTY);
            $aryStr2 = preg_split("//u", $i_str2, -1, PREG_SPLIT_NO_EMPTY);
            
            //1文字ずつ比較
            for($i = 0, $failCount = 0;$i < $compLength;$i++){
                if($aryStr1[$i] !== $aryStr2[$i]){
                   $failCount += 1; 
                }
            }
            
            //差分を加算
            $failCount += abs($strLength1 - $strLength2);
            
            return $failCount;
        }

        //正解
        echo (checkDiffString("apple", "apple") === 0)."\n"; 
        echo (checkDiffString("アップル", "アップル") === 0) ."\n";
        
        //文字数少ない
        echo (checkDiffString("apple", "appl") === 1)."\n";  
        echo (checkDiffString("appl", "apple") ===  1)."\n";  
        echo (checkDiffString("アップル", "") ===  3)."\n"; 
        echo (checkDiffString("", "アップル") ===  3)."\n"; 
        
        //文字数多い
        echo (checkDiffString("apple", "applee") ===  1)."\n";
        echo (checkDiffString("applee", "apple") ===  1)."\n";
        echo (checkDiffString("アップル", "アップルル") ===  1)."\n";
        echo (checkDiffString("アップルル", "アップル") ===  1)."\n";
        
        //先頭違い
        echo (checkDiffString("apple", "xxxle") ===  3)."\n"; 
        echo (checkDiffString("xxxle", "apple") ===  3)."\n"; 
        echo (checkDiffString("アップル", "イップル") ===  1)."\n"; 
        echo (checkDiffString("イップル", "アップル") ===  1)."\n"; 
        
        //末尾違い
        echo (checkDiffString("apple", "apxxx") ===  3)."\n"; 
        echo (checkDiffString("apxxx", "apple") ===  3)."\n"; 
        echo (checkDiffString("アップル", "アップア") ===  1)."\n"; 
        echo (checkDiffString("アップア", "アップル") ===  1)."\n";