개발 꿀팁/PHP

php 배열 요소 찾기 효율 향상 방법

Jammie 2022. 8. 22. 17:16
반응형

1.php in_array 방법 설명
php 배열 요소의 존재 여부 찾기, 일반적으로 사용됩니다.in_array 방법

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

매개 변수 설명:
니들
검색할 값, needl의 경우e는 문자열이고, 비교는 대소문자 구분입니다.

헤이스택
비교에 사용되는 배열

스트릭트
세 번째 인자인 경우 strict 값이 TRUE이면 in_array() 함수가 체크됩니다 니들 클래스타입과 haystack에 있는같다

값 되돌리기
needle을 찾으면TRUE를 반환합니다. 그렇지 않으면 FALSE를 반환합니다.


2.in_array 메타 찾기소효율
비교 배열 haystack가 클 경우 in_array 효율이 떨어질 수 있음

예: in_array 사용10만 개의 원소가 있는 배열에 대해 1000번의 비교를 하다

<?php
$arr = array();

// 10만 개의 요소 배열 만들기
for($i=0; $i<100000; $i++){
    $arr[] = $i;
}

// 기록 시작 시간
$starttime = getMicrotime();

// 1000자리 랜덤 만들기 in_array 비교 사용
for($j=0; $j<1000; $j++){
    $str = mt_rand(1,99999);
    in_array($str, $arr);
}

// 기록 종료 시간
$endtime = getMicrotime();

echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';

/**
 * microtime 가져오기
 * @return float
 */
function getMicrotime(){
    list($usec, $sec) = explode(' ', microtime());
    return (float)$usec + (float)$sec;
}
?>

런타임:2003.6449432373ms

in_array를 사용하여 10만 개의 원소 존재 여부 판단배열에서 1000회 비교, 실행시간 약 2초 소요


3. 원소 찾기 효율 향상 방법
우리는 먼저 array_flip을 이용하여 키 값을 교환한 후,isset 방법으로 원소의 존재 여부를 판단하면 효율을 높일 수 있다.

예:array_flip을 사용하여 키 값을 먼저 교환하고 i를 사용합니다.sset 방법 10만 원소 배열 중 1000회 비교

<?php
$arr = array();

// 10만 개의 요소 배열 만들기
for($i=0; $i<100000; $i++){
    $arr[] = $i;
}

// 키 교환
$arr = array_flip($arr);

// 기록 시작 시간
$starttime = getMicrotime();

// 무작위로 1000자리 만들기 iset 사용 비교
for($j=0; $j<1000; $j++){
    $str = mt_rand(1,99999);
    isset($arr[$str]);
}

// 기록 종료 시간
$endtime = getMicrotime();

echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';

/**
 * microtime 가져오기
 * @return float
 */
function getMicrotime(){
    list($usec, $sec) = explode(' ', microtime());
    return (float)$usec + (float)$sec;
}
?>

언타임: 1.2781620025635ms

array_flip과 iset으로 요소 존재 여부 판단하기10만 개의 원소 배열에서 1000회 비교, 작동 시간은 약 1.2밀리초 소요


따라서 큰 배열의 비교를 위해 array_flip과isset 방법은 in_array보다 훨씬 효율적이다

 

반응형