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";