본문 바로가기

PHP118

[PHP] 초성 검색 기능 구현하기 안녕하세요. 오늘은 'ㅁㅇㅋ'만 입력해도 '마이클' 검색되는 초성 검색 기능을 만들어보겠습니다. 예제 'ㅁㅇㅋ') * * @param string $str 한글 문자열 * @return string 추출된 초성 문자열 */function getChoseong(string $str): string { // 1. 초성 테이블 정의 $choseongList = [ 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' ]; $result = ''; $strLength = mb_strlen($str); // 멀티바이트 문자열 길이 f.. 2025. 11. 2.
[PHP] sscanf()으로 문자열 파싱하기 안녕하세요. 오늘은 sscanf()으로 문자열 파싱해보도록 하겠습니다. 우리는 종종 로그 파일처럼 일정한 형식(예 : [날짜 시간] 레벨: 메시지) 을 가진 문자열을 파싱해야 할 때가 있습니다. 이럴 때 sscanf() 함수를 사용하면 마법처럼 깔끔하게 문제를 해결할 수 있습니다.sscanf는 우리가 제공한 '형식(format)'을 기반으로 문자열을 스캔하여, 원하는 부분을 변수에 담아줍니다. 예제 $date, 'time' => $time, 'level' => $level, // "ERROR" (콜론 없음) 'userId' => $userId, 'message' => isset($message) ? trim($message) : null];print_r($parsedD.. 2025. 10. 30.
[PHP] levenshtein로 유사 검색어 추천 기능 만들기 안녕하세요. 오늘은 levenshtein로 유사 검색어 추천 기능을 만들어보겠습니다. 사용자가 검색창에 '오랜지'라고 오타를 쳤을 때, "혹시 '오렌지'를 찾으셨나요?"라고 되물어보는 기능을 levenshtein()과 similar_text() 함수로 만들어보겠습니다. levenshtein(string1, string2) - '편집 거리(Edit Distance)'를 계산하는 함수입니다. - 한 문자열을 다른 문자열로 바꾸기 위해 몇 글자를 수정(추가, 삭제, 변경)해야 하는지 그 횟수를 정수로 반환합니다. - 이 함수는 글자(character) 단위가 아닌 바이트(byte) 단위로 계산합니다. - levenshtein('apple', 'apply') (영어) -> 1 (e -> y) - l.. 2025. 10. 29.
[PHP] Constructor Property Promotion (생성자 속성 승격) 생성자 속성 승격은 PHP 8.0부터 도입되었습니다. 클래스의 속성을 선언하고 생성자에서 그 값을 초기화 하는 반복적인 코드를 한줄로 줄여주는 기능입니다. 기존에는 클래스 상단에 속성을 선언, 생성자 매개변수를 받아 생성자 본문에서 $this -> $매개변수; 와 같이 일일이 할당 해야했습니다. 기존class Point{ public float $x; public float $y; public float $z; public function __construct( float $x, float $y, float $z ) { $this->x = $x; $this->y = $y; $this->z = $z; .. 2025. 10. 27.
[PHP] Fiber (파이버) 란 안녕하세요. 오늘은 PHP 8.1부터 도입된 기능인 Fiber 에 대해 알아보겠습니다. PHP 는 기본적으로 코드를 한줄 한줄 순서대로 실행합니다. 이 방식은 I/O 작업(외부 API를 호출하거나, 데이터베이스에 쿼리를 보내거나, 큰 파일 읽기와 같은 기다림이 필요한 작업)에서 문제가 발생합니다. '기다리는 시간' 동안 아무것도 하지 않고 CPU를 낭비하며 멍하니 멈춰있습니다.1초가 걸리는 API를 호출하면, PHP 스크립트 전체가 1초 동안 멈추게 됩니다. Fiber 는 이와 같은 상황에서 특정 작업을 일시 중단(Suspend) 시킬 수 있습니다. 즉, 기다리는 동안 다른 작업을 먼저 처리할 수 있도록 합니다. 예제start();// Fiber가 suspend()로 멈춘 동안, 메인 코드는 다른.. 2025. 10. 22.
[PHP] match 표현식 match는 하나의 값을 여러 조건과 비교하여 일치하는 경우 특정 값을 반환하는 표현식입니다. 기존의 switch가 문이었던 것과 차이점입니다. 이로 인해 코드가 간결해지고 예측 가능해집니다. $statusCode = 200;// switch 문 방식$message = '';switch ($statusCode) { case 200: $message = 'OK'; break; case 404: $message = 'Not Found'; break; case 500: $message = 'Server Error'; break; default: $message = 'Unknown Status'; .. 2025. 10. 20.
[PHP] SplMaxHeap 가장 큰 값이 항상 맨 위에 위치하는 자료구조 안녕하세요.오늘은 가장 큰 값이 항상 맨 위에 위치하는 자료구조인 SplMaxHeap에 대해 알아보겠습니다. SplMaxHeapSplMaxHeap은 PHP의 SPL(Standard PHP Library)이 제공하는 자료구조입니다. 이름에서 알 수 있듯이, 가장 큰(Max) 값이 항상 맨 위(Top)에 위치하도록 보장하는 저장소입니다. 데이터를 추가할 때마다 내부적으로 정렬 상태를 자동으로 유지하기 때문에, 언제든지 가장 큰 값을 즉시 조회하거나 꺼내올 수 있습니다. 실시간 랭킹이나 우선순위가 가장 높은 작업을 처리할 때 매우 유용합니다. 주요 메소드insert(value): 힙에 새로운 값을 추가합니다. 추가하는 즉시 힙 구조가 자동으로 재정렬됩니다.top(): 힙에서 값을 제거하지 않고 가장 큰 .. 2025. 10. 19.
[PHP] SplPriorityQueue로 중요 작업 먼저 처리하기 안녕하세요,오늘은 SplPriorityQueue를 활용하여 작업 목록 중 중요 작업 먼저 처리하는 방법을 알아보겠습니다. SplPriorityQueue일반적인 대기열(Queue)은 선입선출(FIFO) 방식으로 작업을 처리합니다.하지만 '긴급 문의'처럼 다른 것보다 먼저 처리해야 할 중요한 작업이 있는 경우, SplPriorityQueue를 사용하여 먼저 처리할 수 있습니다. SplPriorityQueue는 PHP의 SPL(Standard PHP Library)이 제공하는 자료구조입니다. 데이터를 큐에 넣을(insert) 때, 데이터와 함께 '우선순위'를 숫자로 지정할 수 있습니다.데이터를 꺼낼(extract) 때 SplPriorityQueue는 들어온 순서와 상관없이, 지정된 우선순위가 가장 높은 데이.. 2025. 10. 16.
[PHP] MultipleIterator 와 foreach로 여러 배열 동시에 반복하기 안녕하세요. 오늘은 MultipleIterator 와 foreach 를 활용하여 여러 배열 동시에 반복해보도록 하겠습니다. MultipleIterator 서로 다른 여러 배열의 같은 인덱스에 있는 값들을 한 번에 가져와야 할 때가 있습니다.보통 for 루프와 $i 인덱스를 사용하지만, 코드가 지저분해지기 쉽습니다.MultipleIterator를 활용하면 여러 배열(또는 이터레이터)을 하나로 묶어, foreach 루프 한 번으로 각 배열의 요소들을 동시에 접근할 수 있습니다. 예제상품 ID, 이름, 가격이 각각 다른 배열에 담겨 있을 때, MultipleIterator를 사용해 한 번에 출력하는 예제입니다. attachIterator(new ArrayIterator($ids), 'ID');$mi->.. 2025. 10. 15.