PHP에 배열 키가 있는지 확인하는 것이 더 빠르고 더 좋은 방법은 무엇입니까?


157

이 두 가지 예를 고려하십시오 ...

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

이 중 하나가 더 나은지 알고 싶습니다. 나는 항상 첫 번째를 사용했지만 많은 사람들 이이 사이트에서 두 번째 예를 사용하는 것을 보았습니다.

그래서 어느 것이 더 낫습니까? 빨리? 더 명확한 의도?


나는 어떤 벤치 마크도하지 않았다. 물어보기 전에해야합니까?
alex

4
issetarray_key_exists키가 존재하지 않으면 동일하게 동작하도록 만드는 코드 예제 는 정확히 동작하지 않습니다.
deceze

무엇에 대해 in_array? maettig.com/1397246220
DanMan

1
@DanMan, in_arrayO(n)이 숫자가 아닌 키를 확인하기 때문이다. 당신 n이 매우 작지 않으면 거의 항상 느려질 것 입니다.
Pacerier

왜 안돼 $array[$key] === null?
Pacerier

답변:


237

isset()빠르지 만와는 다릅니다 array_key_exists().

array_key_exists()값이 인 경우에도 키가 존재하는지 확인합니다 NULL.

반면이 isset()리턴 false키 존재하고 값이있는 경우 NULL.


6
특정 리소스가 더 빠르다고 주장합니까?
프란체스코 파사

@Francesco Pasa 조금만 생각해보십시오. isset배열 검색 함수가 아니라 기호 테이블에 변수가 있는지 확인하고 배열을 반복하지 않습니다. array_key_exists반면에 지정된 배열의 첫 번째 차원에서 키를 반복 / 검색합니다.

@Rain 확실히 array_key_exists()키가 배열에 있는지 확인합니다. 해시 테이블이므로 검색하지 않습니다.
프란체스코 파사

@FrancescoPasa 음, "키 검색"은 PHP 문서가 말하는 것입니다. 그 외에는 그들에게 "검색"이 나에게 의미하는 것과 완전히 다른 것을 의미하는지 알 수 없습니다.

32

최근에 수행 한 테스트에 관심이 있다면 :

https://stackoverflow.com/a/21759158/520857

요약:

| Method Name                              | Run time             | Difference
=========================================================================================
| NonExistant::noCheckingTest()            | 0.86004090309143     | +18491.315775911%
| NonExistant::emptyTest()                 | 0.0046701431274414   | +0.95346080503016%
| NonExistant::isnullTest()                | 0.88424181938171     | +19014.461681183%
| NonExistant::issetTest()                 | 0.0046260356903076   | Fastest
| NonExistant::arrayKeyExistsTest()        | 1.9001779556274      | +209.73055713%

중요는 다음 arrayKeyExists 타이밍은 매우 잘못된 것으로 발견되었다 -이 키가 아닌 값을 확인했다 - 인 7.1에 개정 된 타이밍에 대한 링크를 따라 훨씬 더. (Pupulus가 해당 테스트를 다시 실행하면 이전 PHP 버전에서도 더 나을 것입니다.)
ToolmakerSteve

19

가장 큰 차이점은 null 값에 해당하는 배열 키는 isset()반환 하지 않는다는 것입니다.truearray_key_exists()

실행중인 작은 벤치 마크 쇼하는 것을 isset()더 빨리이다하지만 완전히 정확하지 않을 수 있습니다.


1
보다 정확한 "(isset ($ array [$ i]) || $ array [$ i] === null)"로 벤치 마크를 다시 실행할 수 있습니까?
Tomalak

아, 그리고 두 변종이 얼마나 많은 성능 차이를 나타내는 지 게시 하시겠습니까? 감사!
Tomalak

1
@ Tomalak, 나는 당신이 제안한 예제를 실행했고, 그것은 array_key_exists ()가 || 운영자. codepad.org/5qyvS93x
alex

1
죽었을 때부터 ...하지만 벤치 마크를 다시 실행하고 조정하여 두 번째 for 루프가 자체 카운터를 초기화하고 결과 배열을 지워야합니다. "isset || null"이 빠르다는 것을 나타냅니다. codepad.org/Np6oPvgS
KyleWpppd

3
@Tomalak, 모든 경우에 isset($array[$i]) || $array[$i] === null반환되므로 의미가 없습니다 true. isset($array[$i]) || $array[$i] === null입력에 관계없이 결코 거짓을 얻지 못할 것 입니다.
Pacerier

10

중간에 빠져 나오지 않았기 때문에이 질문에 2 센트를 추가하고 싶었습니다.

이미 말했듯 isset()이 키의 값을 평가하므로 false해당 값이 배열에 키가 있는지 확인하는 null위치 인 경우 반환 됩니다 array_key_exists().


PHP 7을 사용하여 간단한 벤치 마크를 실행했습니다. 결과는 반복을 완료하는 데 걸린 시간입니다.

$a = [null, true];

isset($a[0])                            # 0.3258841  - false
isset($a[1])                            # 0.28261614 - true
isset($a[2])                            # 0.26198816 - false

array_key_exists(0, $a)                 # 0.46202087 - true
array_key_exists(1, $a)                 # 0.43063688 - true
array_key_exists(2, $a)                 # 0.37593913 - false

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false

array_key_isset(0, $a)                  # 1.17933798 - true
array_key_isset(1, $a)                  # 0.70253706 - true
array_key_isset(2, $a)                  # 1.01110005 - false

이 벤치 마크에이 사용자 정의 함수의 결과를 추가하고 완료했습니다.

function array_key_isset($k, $a){
    return isset($a[$k]) || array_key_exists($k, $a);
}

보았 듯이 이미 말한 것처럼 isset()가장 빠른 방법이지만 값이 인 경우 false를 반환 할 수 있습니다 null. 이것은 원치 않는 결과를 낳을 수 있으며 보통 array_key_exists()그러한 경우에 사용해야 합니다.

그러나 중간 방법이 있으며을 사용하고 isset() || array_key_exists()있습니다. 이 코드는 일반적으로 빠르게 기능을 사용 isset()하고 있는 경우 isset() false를 반환 에만 다음 사용 array_key_exists()의 유효성을 검사. 위의 표에 표시된 것처럼 평소와 같이 빠릅니다 isset().

예, 함수에 작성하고 배치하는 것이 조금 더 느리지 만 훨씬 느립니다. 성능, 빅 데이터 확인 등을 위해 이것이 필요한 경우에는 전체 데이터를 쓰십시오. 그렇지 않으면 1 회 사용으로 매우 작은 오버 헤드 array_key_isset()가 무시할 수 있습니다.


7

Php 7을 사용하면 Null Coalescing Operator 를 사용할 수 있습니다 .

null 통합 연산자 (??)는 isset ()과 함께 삼항을 사용해야하는 일반적인 경우에 구문 설탕으로 추가되었습니다. 존재하고 NULL이 아닌 경우 첫 번째 피연산자를 리턴합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.

따라서 값이 null이거나 키가없는 경우 기본값을 지정할 수 있습니다.

$var = $array[$key] ?? 'default value'

6

php.net과 는 다른 점이 있습니다 .

isset ()은 NULL 값에 해당하는 배열 키에 대해서는 TRUE를 반환하지 않지만 array_key_exists ()는 NULL을 반환합니다.

매우 비공식적 인 테스트는 array_key_exists()약 2.5 배 느립니다.isset()


3

결합 isset()is_null(): 같은 다른 기능에 대해 최상의 성능을 제공 array_key_exists(), isset(), isset()+ array_key_exists(), is_null(), isset()+is_null() , 여기에 유일한 문제는 키가 존재하지 않는 경우 함수가 false를 반환합니다뿐만 아니라,하지만, 심지어 키 존재 및 null 값이 있습니다.

벤치 마크 스크립트 :

<?php
  $a = array('a' => 4, 'e' => null)

  $s = microtime(true); 
  for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
  } 

  $e = microtime(true); 
  echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
?>

크레딧 : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/


1

"빠르게"에 관하여 : 그것을 시도하십시오 (내 돈은 켜져 있습니다 array_key_exists() 있지만 지금 시도 할 수는 없습니다).

"의도에 따라 더 명확하게": array_key_exists()


3
null 동작에 신경 쓰지 않으면 isset ()이 실제로 훨씬 빠릅니다 ( randombenchmarks.com/?p=29 참조 ).
매트 칸토르

0

분명히 두 번째 예는 의도가 더 명확하지만 그것에 대해 의문의 여지가 없습니다. 예제 # 1의 기능을 파악하려면 PHP의 변수 초기화 특성에 익숙해야합니다. 그런 다음 null 값에 대해 다르게 작동한다는 것을 알게 될 것입니다.

어느 쪽이 더 빠를 지-나는 추측하지 않을 것입니다-PHP 버전에서 수십만 번 타이트한 루프에서 실행하면 찾을 수 있습니다 :)


-2

isset($array[$i]) || $array[$i] === null키가 존재하지 않아도 (및 정의되지 않은 인덱스 알림을 생성하더라도) 코드 는 모든 경우에 true를 반환합니다. 최고의 성능을 원한다면if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}


1
유일한 시간 $array[$i] === null.. 내가 배열에 $ 존재하고 NULL 값이있을 때 실행됩니다입니다
니클라스 라슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.