본문 바로가기

전체 글1638

[PHP] usort()로 '사용자 목록'을 '나이 순'으로 정렬 안녕하세요.오늘은 usort()로 '사용자 목록'을 '나이 순'으로 정렬해보도록 하겠습니다. PHP의 기본 sort() 함수는 [5, 1, 3] 같은 단순한 1차원 배열을 [1, 3, 5]로 정렬해줍니다. 하지만 여러 정보를 담고 있는 2차원 배열(혹은 객체 리스트)을 '나이(age) 순'이나 '이름(name) 순'으로 정렬할 때는 sort() 함수로 정렬하기 어렵습니다. 이런 경우 usort() (User-defined Sort)로 비교 규칙을 주어 정렬할 수 있습니다. usort()- 콜백 함수와 우주선 연산자 ()가 핵심입니다. - usort는 function($a, $b) { ... } 형태의 콜백 함수를 받습니다.- 이 함수는 배열의 두 요소($a, $b)를 받아서, 누가 더 큰지 알려주는 .. 2025. 11. 6.
[PHP] NumberFormatter로 '2000000'을 '이백만'으로 변환하기 안녕하세요. 오늘은 NumberFormatter로 '2000000'을 '이백만'으로 변환해보도록 하겠습니다. PHP에서 숫자에 쉼표(,)를 찍을 때, 우리는 보통 number_format(1000000) -> 1,000,000을 사용합니다. 하지만 만약 이 숫자를 '₩1,000,000'처럼 그 나라의 통화 기호를 붙여서 표시하거나, '일백만'이라는 한글 단어로 변환해야 한다면 PHP의 intl 확장 기능에 포함된 NumberFormatter 클래스를 활용할 수 있습니다.이 클래스는 'ko_KR'(한국)이나 'en_US'(미국) 같은 '로캘(Locale)'을 인식하여, 해당 국가의 규칙에 맞게 숫자를 변환해 줍니다. NumberFormatter 클래스는 mbstring처럼 별도의 intl 확장 기능이 .. 2025. 11. 5.
[Python] os.environ 으로 환경변수 관리하기 안녕하세요오늘은 os.environ 활용해서 환경변수를 안전하게 관리하는 방법에 대해 알아보도록 하겠습니다. 환경 변수란,운영체제에 저장된 설정값으로비밀번호, API 키, 데이터베이스 주소처럼 보안상 중요한 정보를 코드에 직접 적지 않고 외부에서 불러올 수 있게 해주는 방법입니다. api_key = "sk-xxxxxx" 와 같은 방법 대신, 환경변수로 저장해두고api_key = os.environ.get("API_KEY") 처럼 불러오게 되면, 보안과 관리가 훨씬 안전해집니다. 전체 코드입니다. main.pyimport os# 환경 변수 설정 (테스트용)# 실제 운영 환경에서는 터미널이나 .env 파일에서 설정하는 게 일반적입니다.os.environ["API_KEY"] = "my_secret_api_.. 2025. 11. 4.
[PHP] IteratorAggregate - 루프에서 사용될 때 어떤 이터레이터를 사용할지 위임하기. [개념 설명]IteratorAggregate는 PHP의 SPL(Standard PHP Library)에 내장된 인터페이스입니다. 어떤 객체가 이 인터페이스를 구현하면, foreach 루프에서 사용될 때 어떻게 반복(iterate)해야 하는지를 다른 이터레이터 객체에게 위임할 수 있습니다. IteratorAggregate는 단 하나의 메소드, getIterator()만 구현하면 됩니다. 이 메소드는 반드시 Traversable 인터페이스(주로 Iterator 또는 다른 IteratorAggregate 객체)를 구현한 객체를 반환해야 합니다.[왜 Iterator 대신 IteratorAggregate를 사용할까요?]Iterator 인터페이스는 rewind(), current(), key(), next(), v.. 2025. 11. 3.
[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.
[Python] pathlib 사용해서 파일과 폴더 다루기 안녕하세요오늘은 pathlib 라이브러리 사용해서 파일과 폴더 다루는 법에 대해 알아보도록 하겠습니다. pathlib 은 파이썬 3.4부터 추가된 표준 라이브러리로, 파일과 디렉토리 경로를 객체처럼 다룰 수 있게 해주는 모듈입니다. 전체 코드입니다. main.pyfrom pathlib import Path# 1. 현재 경로 확인하기p = Path(".")print("현재 경로:", p.resolve())# 2. 특정 파일/폴더 존재 여부print("demo.txt 존재하나요?", (p / "demo.txt").exists())# 3. 새 폴더 생성하기data_dir = Path("data")data_dir.mkdir(exist_ok=True)print("폴더 생성 완료:", data_dir.resolve.. 2025. 10. 28.
[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.