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방
)