귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 개요 == PHP에서 배열의 첫 번째 요소를 가져오는 것은 생각보다 까다로운 작업이었다. 기존의 reset()과 end() 함수는 배열의 "내부 반복자"를 수정하기 때문에 의미적으로 잘못된 접근이며, 모든 유형의 표현식에서 제대로 작동하지 않는 문제가 있었다. '''array_first()'''<ref>미디어위키에서 언더바는 공백으로 치환되어 array first로 나오지만, 실제로는 array_first이다.</ref>는 이러한 문제들을 해결하기 위해 만들어진 함수다. == 문법 == <syntaxhighlight lang="php"> array_first(array $array): mixed </syntaxhighlight> === 매개변수 === * '''$array''' (array): 첫 번째 값을 추출할 대상 배열 === 반환값 === * 배열의 첫 번째 값 (mixed) * 빈 배열인 경우 null 반환 == 기본 사용법 == === 인덱스 배열에서의 사용 === <syntaxhighlight lang="php"> // 기본적인 인덱스 배열 $array = [1, 2, 3]; $first = array_first($array); echo $first; // 출력: 1 // 다양한 데이터 타입 $mixed = [null, 2, 3]; $first = array_first($mixed); var_dump($first); // 출력: null $boolean = [true, false]; $first = array_first($boolean); var_dump($first); // 출력: bool(true) $objects = [new stdClass(), 'string', 123]; $first = array_first($objects); var_dump($first); // 출력: object(stdClass) </syntaxhighlight> === 연관 배열에서의 사용 === <syntaxhighlight lang="php"> // 연관 배열 $associative = ['a' => 2, 'b' => 1, 'c' => 3]; $first = array_first($associative); echo $first; // 출력: 2 // 키가 정수가 아닌 배열 $fruits = [ 4 => 'apple', 7 => 'orange', 13 => 'plum' ]; $first = array_first($fruits); echo $first; // 출력: apple </syntaxhighlight> === 빈 배열 처리 === <syntaxhighlight lang="php"> // 빈 배열 $empty = []; $first = array_first($empty); var_dump($first); // 출력: null // null 자체도 유효한 배열 값이므로 주의 $withNull = [null, 'second', 'third']; $first = array_first($withNull); var_dump($first); // 출력: null (실제 첫 번째 값) </syntaxhighlight> == 기존 방법들과의 비교 == === reset() 함수의 문제점 === <syntaxhighlight lang="php"> $array = ['apple', 'banana', 'cherry']; // reset() 사용 - 내부 포인터 수정됨 $first = reset($array); echo current($array); // 'apple' - 포인터가 첫 번째로 이동됨 // 함수 반환값에 직접 적용 시 문제 발생 function getArray() { return ['a', 'b', 'c']; } // 이 코드는 PHP 경고 발생 가능 // $first = reset(getArray()); // Warning: Only variables should be passed by reference // array_first()는 이런 문제가 없음 $first = array_first(getArray()); // 문제없음 </syntaxhighlight> === 직접 인덱스 접근의 한계 === <syntaxhighlight lang="php"> $array = [4 => 'apple', 7 => 'orange']; // 잘못된 방법 - 0번 인덱스가 없을 수 있음 // echo $array[0]; // Warning: Undefined array key 0 // 올바른 방법 echo array_first($array); // 'apple' </syntaxhighlight> === array_key_first() 조합의 번거로움 === <syntaxhighlight lang="php"> $array = ['key1' => 'value1', 'key2' => 'value2']; // 기존의 복잡한 방법 $first = $array[array_key_first($array)]; // 새로운 간단한 방법 $first = array_first($array); </syntaxhighlight> === array_values() 방법의 비효율성 === <syntaxhighlight lang="php"> $largeArray = array_fill(0, 100000, 'data'); // 비효율적 - 전체 배열을 복사함 $first = array_values($largeArray)[0]; // 효율적 - 첫 번째 값만 반환 $first = array_first($largeArray); </syntaxhighlight> == 실무 활용 예제 == === 설정 관리 === <syntaxhighlight lang="php"> // 환경별 데이터베이스 설정 $dbConfigs = [ 'production' => ['host' => 'prod.db.com', 'port' => 5432], 'staging' => ['host' => 'stage.db.com', 'port' => 5432], 'development' => ['host' => 'localhost', 'port' => 5432] ]; // 첫 번째(우선순위 높은) 설정 사용 $primaryConfig = array_first($dbConfigs); echo "Primary DB Host: " . $primaryConfig['host']; </syntaxhighlight> === API 응답 처리 === <syntaxhighlight lang="php"> // API에서 받은 검색 결과 $searchResults = [ ['title' => 'PHP 8.5 Features', 'relevance' => 95], ['title' => 'Array Functions', 'relevance' => 88], ['title' => 'Modern PHP', 'relevance' => 82] ]; // 가장 관련성 높은 첫 번째 결과 사용 $topResult = array_first($searchResults); if ($topResult !== null) { echo "Top result: " . $topResult['title']; echo " (Relevance: " . $topResult['relevance'] . "%)"; } else { echo "No results found"; } </syntaxhighlight> === 폴백 메커니즘 === <syntaxhighlight lang="php"> // 여러 데이터 소스에서 순서대로 시도 $dataSources = [ 'cache' => getCachedData(), 'database' => getDatabaseData(), 'api' => getApiData() ]; // null이 아닌 첫 번째 데이터 소스 찾기 $validData = null; foreach ($dataSources as $source => $data) { if ($data !== null) { $validData = $data; error_log("Data retrieved from: $source"); break; } } // 또는 array_first()로 첫 번째 유효한 소스의 이름 확인 $firstSourceName = array_first(array_keys(array_filter($dataSources))); </syntaxhighlight> === 배치 처리 === <syntaxhighlight lang="php"> // 처리할 작업 큐 $jobQueue = [ ['id' => 1, 'type' => 'email', 'priority' => 'high'], ['id' => 2, 'type' => 'report', 'priority' => 'medium'], ['id' => 3, 'type' => 'backup', 'priority' => 'low'] ]; // 첫 번째 작업 처리 $nextJob = array_first($jobQueue); if ($nextJob !== null) { processJob($nextJob); // 처리된 작업은 큐에서 제거 array_shift($jobQueue); } function processJob($job) { echo "Processing job {$job['id']}: {$job['type']} ({$job['priority']} priority)\n"; } </syntaxhighlight> === 사용자 권한 확인 === <syntaxhighlight lang="php"> // 사용자의 역할 목록 (우선순위 순) $userRoles = ['admin', 'editor', 'user']; // 최고 권한 확인 $primaryRole = array_first($userRoles); switch ($primaryRole) { case 'admin': echo "Full access granted"; break; case 'editor': echo "Edit access granted"; break; case 'user': echo "Read access granted"; break; default: echo "No access"; } </syntaxhighlight> == 성능 특성 == === 시간 복잡도 === * '''O(1)''' - 상수 시간 복잡도 * 배열 크기에 관계없이 동일한 성능 === 메모리 사용량 === <syntaxhighlight lang="php"> // 대용량 배열 테스트 $hugeArray = array_fill(0, 1000000, 'data'); // array_first() - 메모리 효율적 $memory_before = memory_get_usage(); $first = array_first($hugeArray); $memory_after = memory_get_usage(); echo "array_first() 메모리 사용량: " . ($memory_after - $memory_before) . " bytes\n"; // array_values() - 메모리 비효율적 (전체 배열 복사) $memory_before = memory_get_usage(); $first = array_values($hugeArray)[0]; $memory_after = memory_get_usage(); echo "array_values()[0] 메모리 사용량: " . ($memory_after - $memory_before) . " bytes\n"; </syntaxhighlight> == PHP 버전별 폴리필 == === PHP 8.4 이하를 위한 사용자 정의 구현 === <syntaxhighlight lang="php"> if (!function_exists('array_first')) { /** * PHP 8.5 array_first() 함수의 폴리필 * * @param array $array 대상 배열 * @return mixed 첫 번째 값 또는 null (빈 배열인 경우) */ function array_first(array $array): mixed { return $array === [] ? null : $array[array_key_first($array)]; } } </syntaxhighlight> === Symfony 폴리필 사용 === <syntaxhighlight lang="bash"> composer require symfony/polyfill-php85 </syntaxhighlight> <syntaxhighlight lang="php"> // Symfony 폴리필 자동 로드 use Symfony\Polyfill\Php85\Php85; $array = ['apple', 'banana', 'cherry']; $first = array_first($array); </syntaxhighlight> == 주의사항 및 제한사항 == === 네임스페이스 충돌 === <syntaxhighlight lang="php"> // 기존에 array_first() 함수를 정의한 경우 function array_first($array) { // 사용자 정의 구현 } // PHP 8.5에서는 Fatal Error 발생 // Fatal error: Cannot redeclare array_first() // 해결 방법 1: 조건부 정의 if (!function_exists('array_first')) { function array_first($array) { // 사용자 정의 구현 } } // 해결 방법 2: 네임스페이스 사용 namespace MyApp; function array_first($array) { // 네임스페이스 내 함수 } </syntaxhighlight> === null 값의 모호성 === <syntaxhighlight lang="php"> $array1 = []; // 빈 배열 $array2 = [null]; // null을 포함한 배열 $array3 = [null, 'second']; // null이 첫 번째인 배열 $result1 = array_first($array1); // null (빈 배열) $result2 = array_first($array2); // null (실제 값) $result3 = array_first($array3); // null (실제 값) // 빈 배열과 null 값 구분이 필요한 경우 function safe_array_first($array) { if (empty($array)) { throw new InvalidArgumentException('Array is empty'); } return array_first($array); } </syntaxhighlight> === 타입 안전성 === <syntaxhighlight lang="php"> // mixed 반환 타입으로 인한 타입 체크 필요 $array = ['123', 456, true, null]; $first = array_first($array); // 타입별 처리 if (is_string($first)) { echo "String: " . $first; } elseif (is_int($first)) { echo "Integer: " . $first; } elseif (is_bool($first)) { echo "Boolean: " . ($first ? 'true' : 'false'); } elseif (is_null($first)) { echo "Null value"; } </syntaxhighlight> == RFC 및 개발 과정 == 이 함수는 2025년 3월 31일자 RFC를 통해 제안되었으며, 커뮤니티의 압도적으로 긍정적인 반응을 받고 있다.<ref>배열 작업을 더 안전하고 직관적이고, 속도도 항상 O(1)이기에 긍정적인 것이 당연하다.</ref> PHP 소스 코드의 마스터 브랜치에 이미 구현되어 병합된 상태다. === 설계 결정사항 === * '''기본값 매개변수 제외''': PHP 배열이 타입이 없어서 의미 있는 센티넬 값을 정의하기 어렵고, 배열 함수들에 대한 선례가 없음 * '''함수명 선택''': array_value_first 대신 array_first를 선택한 이유는 기존 배열 함수들과의 일관성 유지 == 마이그레이션 가이드 == === PHP 8.4에서 8.5로 업그레이드 === <syntaxhighlight lang="php"> // 기존 코드 (PHP 8.4 이하) function getFirstElement($array) { if (empty($array)) { return null; } return reset($array); } // 새로운 코드 (PHP 8.5+) function getFirstElement($array) { return array_first($array); } </syntaxhighlight> === 점진적 마이그레이션 === <syntaxhighlight lang="php"> // 1단계: 폴리필 추가 if (!function_exists('array_first')) { function array_first(array $array): mixed { return $array === [] ? null : $array[array_key_first($array)]; } } // 2단계: 기존 코드에서 array_first() 사용 $data = getUserData(); $firstUser = array_first($data); // 3단계: PHP 8.5 업그레이드 후 폴리필 제거 </syntaxhighlight> == 각주 == <references /> <!-- 분류 --> [[분류:PHP]] [[분류:PHP/8.5]] [[분류:배열]] 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림)