PHP 버전
7.4+
$str = '반갑습니다!';

/* 문자열의 길이를 1만큼으로 분할하는 예
   str_split()과 mb_str_split()의 차이점 */

// 한글 지원하지 않음(길이는 1 byte 기준입니다.)
$arr1 = str_split($str, 1);
print_r($arr1);
/* 출력:
    Array
    (
        [0] => �
        [1] => �
        [2] => �
        [3] => �
        [4] => �
        [5] => �
        [6] => �
        [7] => �
        [8] => �
        [9] => �
        [10] => �
        [11] => �
        [12] => �
        [13] => �
        [14] => �
        [15] => !
    ) 
*/

// 한글과 같은 multi-byte 문자열을 지원(길이는 문자 단위 기준입니다.)
$arr2 = mb_str_split($str, 1, 'UTF-8');
print_r($arr2);
/* 출력:
    Array
    (
        [0] => 반
        [1] => 갑
        [2] => 습
        [3] => 니
        [4] => 다
        [5] => !
    )
*/
mb_str_split(string $string, int $length = 1, ?string $encoding = null): array
$str = '환영합니다';
$array = mb_str_split($str, 1, 'UTF-8');
$reversed_array = array_reverse($array);
$reversed_string = implode('', $reversed_array);

echo $reversed_string; // 출력: '다니합영환'
function mask_name($name) {
    // 한글/다국어 문자열을 1글자씩 배열로 분할
    $chars = mb_str_split($name, 1, 'UTF-8');
    $length = count($chars);

    if ($length <= 1) {
        return $name;
    }

    if ($length === 2) {
        // 2글자 이름 (예: 홍길 -> 홍*)
        $chars[1] = '*';
    } else {
        // 3글자 이상 (예: 홍길동 -> 홍*동, 남궁길동 -> 남**동)
        for ($i = 1; $i < $length - 1; $i++) {
            $chars[$i] = '*';
        }
    }

    return implode('', $chars);
}

echo mask_name("김");       // 김
echo "<br>";
echo mask_name("김민");     // 김*
echo "<br>";
echo mask_name("홍길동");   // 홍*동
echo "<br>";
echo mask_name("남궁민수"); // 남**수
echo "<br>";
echo mask_name("아름다운이름"); // 아****름