PHP에서 연관 배열을 다루다 보면 문자열 키나 불연속적인 숫자 키를 0부터 시작하는 연속된 인덱스로 재설정해야 하는 경우가 자주 발생합니다. 이럴 때 가장 간단하고 효율적으로 사용할 수 있는 함수가 바로 array_values()입니다.array_values()는 배열의 모든 값을 반환하면서, 기존의 키는 버리고 새로운 숫자 인덱스(0부터 시작)를 자동으로 부여합니다. 원본 배열은 그대로 유지되며, 결과는 새로운 배열로 반환됩니다.예제 1: 문자열 키 재설정하기다음은 문자열 키를 가진 배열의 키를 재설정하는 예제입니다.<?p
PHP 프로젝트를 진행하다 보면 시작 날짜부터 종료 날짜까지 모든 날짜를 목록으로 가져와야 하는 경우가 종종 있습니다. 예를 들어 캘린더 기능, 통계 집계, 예약 시스템 등을 구현할 때 유용하게 활용됩니다. 이 글에서는 strtotime() 함수와 반복문을 조합하여 두 날짜 사이의 모든 날짜를 배열로 반환하는 방법을 소개합니다.예제 코드<?php function displayDates($date1, $date2, $format = d-m-Y) { &nb
PHP에서 echo와 print는 모두 문자열을 화면에 출력하기 위한 언어 구조(language construct)입니다. 두 구문의 가장 큰 차이점은 반환값입니다. echo는 반환값이 없는 void 타입인 반면, print는 항상 1을 반환하므로 표현식(expression) 내부에서 사용할 수 있습니다.print_r은 변수에 대한 사람이 읽기 쉬운(human-readable) 정보를 출력하는 함수로, 특히 배열이나 객체의 내부 구조를 확인할 때 매우 유용합니다.주요 차이점 비교echo: 반환값이 없으며, 쉼표(,)를 이용해 여러
PHP에서 여러 배열을 하나로 합치는 대표적인 방법은 array_merge() 함수와 +(더하기) 연산자입니다. 두 방식 모두 배열의 합집합을 구한다는 점에서 비슷해 보이지만, 내부적으로 동작하는 방식은 완전히 다릅니다. 이 글에서는 두 방식의 차이점을 예제 코드와 함께 살펴보겠습니다. 핵심 차이점 요약 + 연산자: 왼쪽(앞쪽) 배열의 값을 우선합니다. 동일한 키가 양쪽 배열에 모두 존재하면 왼쪽 배열의 값이 유지되고, 오른쪽 배열의 중복 키는 무시됩니다. array_merge(): 동일한 문자열(non-numeric) 키가 존재
FPDI 라이브러리를 사용해 PDF를 생성할 때 한글이나 특수 문자가 깨지는 문제를 겪는 경우가 많습니다. 이는 PDF 문서가 기본적으로 UTF-8을 지원하지 않고, 특정 인코딩 방식을 요구하기 때문입니다. 이 글에서는 FPDI에서 올바른 인코딩을 설정하는 방법을 단계별로 살펴보겠습니다.1. 올바른 알파벳을 지원하는 새 폰트 추가인코딩 문제를 해결하는 첫 번째 단계는 필요한 문자 집합(alphabet)을 정확히 지원하는 폰트를 추가하는 것입니다. 아래 코드처럼 AddFont()와 SetFont() 메서드를 사용합니다.$pdf->
PHP 7의 익명 클래스란?PHP 7 버전부터 익명 클래스(Anonymous Class) 기능이 도입되었습니다. PHP에서 모든 객체는 반드시 어떤 클래스와 연결되어 있는데, 익명 클래스는 이름 없이 정의되는 클래스로, 필요한 시점에 바로 인스턴스화하여 객체를 생성할 수 있습니다.익명 클래스는 한 번만 사용할 간단한 객체가 필요하거나, 별도의 클래스 파일을 만들기 애매한 상황에서 코드를 깔끔하게 유지하는 데 유용합니다.예제 코드<?php class my_sample_class {}&nb
PHP 애플리케이션에서 예기치 않은 오류가 발생했을 때, 그 원인이 OPcache인지 확인하는 것은 중요한 디버깅 단계입니다. 이 글에서는 OPcache 문제를 진단하고 기록하는 몇 가지 효과적인 방법을 단계별로 소개합니다.1. OPcache 임시 비활성화로 원인 확인스크립트에 아래 코드를 추가하면 OPcache를 일시적으로 비활성화할 수 있습니다.ini_set(opcache.enable, 0);이 방법을 사용하면 스크립트 오류의 원인이 OPcache 때문인지 손쉽게 판별할 수 있습니다. 덕분에 설치된 모든 확장 모듈을 하나씩 켜고
PHPUnit 테스트 구성이란?PHPStorm은 PHP 생태계에서 가장 널리 사용되는 테스트 프레임워크인 PHPUnit과 연동하여 PHP 애플리케이션을 체계적으로 테스트할 수 있는 강력한 IDE입니다. 본격적인 테스트 작업에 앞서 몇 가지 사전 준비와 단계별 구성 과정이 필요합니다.사전 준비 사항PHPUnit 테스트 환경을 구성하기 전에 아래 두 가지가 반드시 준비되어 있어야 합니다.PHP 인터프리터 설정: PHPStorm에서 PHP 코드를 실행하고 테스트하려면 먼저 PHP 인터프리터가 올바르게 설정되어 있어야 합니다.Compose
PHP의 filter_input() 함수는 자체적으로 AND/OR 논리 연산자를 직접 지원하지는 않지만, 필터 플래그와 배열 처리 기법을 활용하면 사실상 동일한 결과를 얻을 수 있습니다. 핵심은 입력값이 배열인지 스칼라(단일 값)인지에 따라 적절한 필터 옵션을 분기 처리하는 것입니다.배열 입력 처리하기POST로 전달된 값이 배열 형태일 경우 FILTER_REQUIRE_ARRAY 플래그를 사용하면 됩니다. 삼항 연산자를 이용해 동적으로 플래그를 지정하는 방식이 가장 간결합니다.$value = filter_input( INPUT
PHP에서 문자열에 포함된 공백을 제거해야 하는 경우는 매우 흔합니다. 상황에 따라 단순히 띄어쓰기(스페이스)만 제거할 수도 있고, 탭이나 줄바꿈 문자까지 포함한 모든 공백 문자를 한 번에 없애야 할 수도 있습니다. 이 글에서는 세 가지 대표적인 방법을 예제 코드와 함께 자세히 살펴보겠습니다.1. strtr() 함수를 사용하는 방법strtr() 함수는 문자열 내의 특정 문자를 다른 문자로 변환할 때 사용됩니다. 이 함수를 활용하면 공백을 빈 문자열로 치환하여 제거할 수 있습니다. 단, strtr()은 원본 문자열을 직접 수정하지 않
PHP 배열 저장 방식의 선택 기준PHP에서 배열을 저장할 때 json_encode와 serialize 중 어떤 방식을 선택할지는 프로젝트의 요구 사항에 따라 달라집니다. 일반적으로 JSON이 PHP 직렬화보다 속도가 더 빠르지만, 아래와 같은 조건에는 예외가 됩니다.깊게 중첩된 배열을 저장해야 하는 경우저장된 객체를 특정 클래스 인스턴스로 복원해야 하는 경우json_decode를 지원하지 않는 구버전 PHP와 상호 작용해야 하는 경우위 조건에 해당하지 않는다면, 다음 코드처럼 json_encode를 사용하여 PHP 배열을 저장하는
PHP에서 var_dump()는 변수의 자료형과 값을 상세히 출력해주는 디버깅용 함수입니다. 하지만 이 함수는 기본적으로 화면에 직접 출력되기 때문에, 결과를 로그 파일에 저장하거나 다른 문자열 처리 작업에 활용하려면 불편함이 있습니다.이럴 때 출력 버퍼링(Output Buffering)을 사용하면 var_dump()의 결과를 문자열로 손쉽게 캡처할 수 있습니다. 아래 예제를 통해 확인해 보겠습니다.예제 코드<?php function varDumpToString($var) { &
PHP에서는 parse_url과 parse_str 함수를 조합하면 정규식 없이도 간단하게 YouTube 동영상 ID를 추출할 수 있습니다.예제 코드<?php $url = https://www.youtube.com/watch?v=VX96I7PO8YU; parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array ); echo $my_array[v];?>실행 결과VX
PHP 개발 중 특정 디렉토리 안에 어떤 하위 디렉토리들이 있는지 확인해야 하는 경우가 자주 있습니다. 이럴 때 glob() 함수와 is_dir() 함수를 조합하거나, GLOB_ONLYDIR 플래그를 활용하면 아주 간단하게 해결할 수 있습니다.방법 1: glob()과 is_dir()로 디렉토리만 필터링하기먼저 glob() 함수로 대상 경로의 모든 항목(파일 및 디렉토리)을 가져온 뒤, array_filter()와 is_dir() 콜백을 사용해 디렉토리 항목만 남기는 방식입니다.예제 코드<?php
PHP에서는 property_exists() 함수 또는 isset() 함수를 사용하여 객체나 클래스에 특정 속성(property)이 존재하는지 확인할 수 있습니다. 두 함수는 비슷한 목적으로 사용되지만 동작 방식에 중요한 차이가 있으므로 상황에 맞게 선택하는 것이 좋습니다.property_exists() 함수property_exists()는 클래스 정의 자체에 해당 속성이 선언되어 있는지 검사합니다. 접근 제한자(public, protected, private)와 관계없이, 그리고 속성 값이 null이더라도 속성이 선언되어 있으면
PHP에서 for 루프와 foreach 루프의 성능 비교PHP에서 배열을 순회할 때 흔히 사용하는 foreach는 일반적인 for 루프에 비해 속도가 느린 것으로 알려져 있습니다. 그 이유는 foreach가 반복을 수행하기 전에 해당 배열을 복사(copy)하기 때문입니다. 배열의 크기가 클수록 이 복사 과정에서 발생하는 오버헤드가 커져 성능 저하로 이어집니다.따라서 성능을 개선하려면 참조(reference) 개념을 활용하는 것이 효과적입니다. 참조(&)를 사용하면 원본 배열을 직접 조작하게 되어 복사 과정이 생략되고, 실행
PHP에서 CSV 파일을 읽고 데이터를 처리해야 하는 경우는 매우 흔합니다. 이 글에서는 대표적인 두 가지 방법을 예제 코드와 함께 자세히 설명합니다. 방법 1: fopen()과 fgetcsv()로 한 줄씩 읽기 먼저 fopen() 함수에 .csv 파일의 경로를 지정하여 파일을 엽니다. 그런 다음 fgetcsv()를 이용해 각 줄을 배열 형태로 읽어올 수 있습니다. 예제 코드 $row_count = 1; if (($infile = fopen(path to .csv file, r)) !== FALSE) { while (($da
PHP에서 조건에 따라 값을 선택할 때 자주 사용되는 두 가지 연산자가 있습니다. 바로 삼항 연산자(Ternary Operator)와 Null 병합 연산자(Null Coalescing Operator, ??)입니다. 두 연산자는 비슷해 보이지만 내부적으로 평가하는 방식과 용도에서 중요한 차이가 있습니다. 삼항 연산자 (Ternary Operator) 삼항 연산자는 길게 작성해야 하는 if-else 문을 한 줄로 간결하게 표현할 때 사용합니다. 조건의 참·거짓 여부에 따라 두 표현식 중 하나를 반환합니다. 문법 (condition
!== 비교 연산자란?!== 연산자는 두 값이 서로 같지 않은지를 검사하면서 자료형까지 함께 비교하는 엄격한(strict) 비교 연산자입니다. 이 연산자는 자료형을 자동으로 변환하지 않으므로, 값과 타입 모두를 기준으로 판단합니다.예를 들어 1 !== 1은 숫자 1과 문자열 1을 비교하는데, 값은 같아도 자료형이 다르기 때문에 true를 반환합니다.==! 비교 연산자란?==!는 사실 하나의 독립적인 연산자가 아니라 두 개의 연산자가 결합된 형태입니다. PHP는 이를 == (!$y)처럼 해석합니다. 즉, 먼저 피연산자에 부정 연산자(
PHP에는 외형이 비슷하지만 동작 방식이 완전히 다른 두 가지 OR 연산자가 있습니다. 바로 비트 단위로 동작하는 |(비트 OR) 연산자와 논리 판단에 사용되는 ||(논리 OR) 연산자입니다. 두 연산자의 차이를 정확히 이해하면 조건문과 비트 연산에서 발생할 수 있는 오류를 예방할 수 있습니다. | 비트 OR(Bitwise OR) 연산자 | 연산자는 비트 단위 OR 연산자입니다. 두 숫자를 이진수로 변환한 뒤, 대응하는 각 비트를 서로 비교하여 하나라도 1이면 결과 비트를 1로 설정합니다. 주로 플래그(flag) 처리나 권한 비트