PHP
[PHP] 초성 검색 기능 구현하기
teamnova
2025. 11. 2. 13:19
728x90
안녕하세요.
오늘은 'ㅁㅇㅋ'만 입력해도 '마이클' 검색되는 초성 검색 기능을 만들어보겠습니다.
예제
<?php
/**
* 한글 문자열에서 초성만 추출하는 함수
* (e.g., '마이클' -> 'ㅁㅇㅋ')
*
* @param string $str 한글 문자열
* @return string 추출된 초성 문자열
*/
function getChoseong(string $str): string {
// 1. 초성 테이블 정의
$choseongList = [
'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ',
'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'
];
$result = '';
$strLength = mb_strlen($str); // 멀티바이트 문자열 길이
for ($i = 0; $i < $strLength; $i++) {
$char = mb_substr($str, $i, 1); // 한 글자씩 자름
// 2. 글자의 유니코드(UTF-32) 코드 포인트(숫자)를 가져옴
// '마' -> 0xB9C8 (47560)
$code = unpack('N', mb_convert_encoding($char, 'UTF-32BE', 'UTF-8'))[1];
// 3. 한글 음절 범위(가~힣)인지 확인
if ($code >= 0xAC00 && $code <= 0xD7A3) {
// 4. 유니코드 공식 적용: (코드 - 0xAC00) / 28 / 21
$choseongIndex = floor(($code - 0xAC00) / (21 * 28));
// 5. 초성 테이블에서 해당 초성을 찾아 결과에 추가
$result .= $choseongList[$choseongIndex];
} else {
// 6. 한글이 아니면 (영어, 숫자, 특수문자, 'ㅁ'같은 자음)
// 원본 문자를 그대로 결과에 추가
$result .= $char;
}
}
return $result;
}
// --- 검색 로직 예제 ---
// 사용자가 입력한 검색어
$userInput = 'ㅁㅇㅋ';
// DB에 저장된 원본 데이터 목록 (가정)
$dbData = [
'마이클 조던',
'김민수',
'마케팅 부서',
'미켈란젤로',
'ㅁㅇㅋ PC방' // 'ㅁㅇㅋ' 자체도 검색되도록
];
echo "--- '{$userInput}' 검색 결과 ---\n";
$found = [];
foreach ($dbData as $item) {
// 1. DB 데이터를 초성으로 변환
$choseong = getChoseong($item); // '마이클 조던' -> 'ㅁㅇㅋ ㅈㄷ'
// 2. 사용자의 초성 입력이 변환된 초성 문자열의 '시작' 부분과 일치하는지 확인
if (str_starts_with($choseong, $userInput)) {
$found[] = $item;
}
}
// 결과 출력
if (empty($found)) {
echo "검색 결과가 없습니다.";
} else {
print_r($found);
}
?>
실행결과
--- 'ㅁㅇㅋ' 검색 결과 ---
Array
(
[0] => 마이클 조던
[1] => ㅁㅇㅋ PC방
)