<?php
/**
* マルチバイト文字列、英数字の混じった文字列を1文字ずつ配列に分割
* 参考:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1417635014#
* mb_split, str_split, preg_splitことごとく使えない。
*/
function mbStringToArray($string, $encoding = 'UTF-8') {
$arrayResult = array();
while ($iLen = mb_strlen($string, $encoding)) {
array_push($arrayResult, mb_substr($string, 0, 1, $encoding));
$string = mb_substr($string, 1, $iLen, $encoding);
}
return $arrayResult;
}
/**
* 編集距離(レーベンシュタイン距離)を求める(マルチバイト文字対応)
* @param $str1
* @param $str2
* @param $encoding
* @param $costReplace
* @return 数値(距離),かぶっていた文字の数
*/
function LevenshteinDistance($str1, $str2, $costReplace = 2, $encoding = 'UTF-8') {
$count_same_letter = 0;
$d = array();
$mb_len1 = mb_strlen($str1, $encoding);
$mb_len2 = mb_strlen($str2, $encoding);
$mb_str1 = mbStringToArray($str1, $encoding);
$mb_str2 = mbStringToArray($str2, $encoding);
for ($i1 = 0; $i1 <= $mb_len1; $i1++) {
$d[$i1] = array();
$d[$i1][0] = $i1;
}
for ($i2 = 0; $i2 <= $mb_len2; $i2++) {
$d[0][$i2] = $i2;
}
for ($i1 = 1; $i1 <= $mb_len1; $i1++) {
for ($i2 = 1; $i2 <= $mb_len2; $i2++) {
// $cost = ($str1[$i1 - 1] == $str2[$i2 - 1]) ? 0 : 1;
if ($mb_str1[$i1 - 1] === $mb_str2[$i2 - 1]) {
$cost = 0;
$count_same_letter++;
} else {
$cost = $costReplace; //置換
}
$d[$i1][$i2] = min($d[$i1 - 1][$i2] + 1, //挿入
$d[$i1][$i2 - 1] + 1, //削除
$d[$i1 - 1][$i2 - 1] + $cost);
}
}
//return $d[$mb_len1][$mb_len2];
return array('distance' => $d[$mb_len1][$mb_len2], 'count_same_letter' => $count_same_letter);
}
echo LevenshteinDistance("aaa","aax",1,"UTF-8");
?>
- Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.6
- Warning: Array to string conversion in /in/QM2Aq on line 59
Array
- Output for 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.38, 7.0.0 - 7.0.33, 7.1.0 - 7.1.25, 7.2.0 - 7.2.33, 7.3.0 - 7.3.31, 7.4.0 - 7.4.33
- Notice: Array to string conversion in /in/QM2Aq on line 59
Array
- Output for 4.3.0 - 4.3.11, 4.4.0 - 4.4.9, 5.0.0 - 5.0.5, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 7.3.32 - 7.3.33
- Array
preferences:
268.21 ms | 403 KiB | 424 Q