[php] 빈 배열 확인 : 개수 대 비어 있음

PHP 배열이 비어 있는지 확인하는 방법 ‘에 대한이 질문은이 질문에 대해 생각했습니다.

배열이 비어 있는지 여부를 결정할 때 count대신 사용해야 하는 이유가 empty있습니까?

내 개인적인 생각은 empty부울 질문에 부울 답변을 제공 하기 때문에 사용해야하는 빈 배열의 경우 2가 동일하다면 것 입니다. 위에 링크 된 질문에서 그것이 count($var) == 0대중적인 방법 인 것 같습니다 . 나에게는 기술적으로 정확하지만 말이되지 않습니다. 예 : $ var, 비어 있습니까? A : 7 . 흠 …

count == 0대신 사용해야하는 이유가 있습니까 아니면 개인적인 취향의 문제입니까?

지금 삭제 된 답변에 대한 주석에서 다른 사람들이 지적 count했듯이은 모든 요소를 ​​계산해야하기 때문에 큰 배열의 성능에 영향을 미치는 반면 empty비어 있지 않다는 것을 알게되는 즉시 중지 할 수 있습니다. 따라서이 경우 동일한 결과를 제공하지만 count잠재적으로 비효율적이라면 왜 우리는 count($var) == 0?



답변

나는 일반적으로 empty. 사람들이 실제로 count를 사용하는 이유를 모르겠습니다. 배열이 크면 count가 더 오래 걸리거나 오버 헤드가 더 많습니다. 배열이 비어 있는지 여부를 알 필요가 있다면 empty를 사용하십시오.


답변

어떤 것이 실제로 더 빠른지 궁금해서 이러한 기능을 벤치마킹하는 간단한 스크립트를 만들었습니다.

<?php

function benchmark($name, $iterations, $action){
    $time=microtime(true);
    for($i=0;$i<=$iterations;++$i){
        $action();
    }
    echo $name . ' ' . round(microtime(true)-$time, 6) . "\n";
}

$iterations = 1000000;
$x = array();
$y = range(0, 10000000);
$actions = array(
    "Empty empty()" => function() use($x){
        empty($x);
    },
    "Empty count()" => function() use($x){
        count($x);
    },
    "Full empty()" => function() use($y){
        empty($y);
    },
    "Full count()" => function() use($y){
        count($y);
    },
    ############
    "IF empty empty()" => function() use($x){
        if(empty($x)){ $t=1; }
    },
    "IF empty count()" => function() use($x){
        if(count($x)){ $t=1; }
    },
    "IF full empty()" => function() use($y){
        if(empty($y)){ $t=1; }
    },
    "IF full count()" => function() use($y){
        if(count($y)){ $t=1; }
    },
    ############
    "OR empty empty()" => function() use($x){
        empty($x) OR $t=1;
    },
    "OR empty count()" => function() use($x){
        count($x) OR $t=1;
    },
    "OR full empty()" => function() use($y){
        empty($y) OR $t=1;
    },
    "OR full count()" => function() use($y){
        count($y) OR $t=1;
    },
    ############
    "IF/ELSE empty empty()" => function() use($x){
        if(empty($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE empty count()" => function() use($x){
        if(count($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full empty()" => function() use($y){
        if(empty($y)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full count()" => function() use($y){
        if(count($y)){ $t=1; } else { $t=2; }
    },
    ############
    "( ? : ) empty empty()" => function() use($x){
        $t = (empty($x) ? 1 : 2);
    },
    "( ? : ) empty count()" => function() use($x){
        $t = (count($x) ? 1 : 2);
    },
    "( ? : ) full empty()" => function() use($y){
        $t = (empty($y) ? 1 : 2);
    },
    "( ? : ) full count()" => function() use($y){
        $t = (count($y) ? 1 : 2);
    }
);

foreach($actions as $name => $action){
    benchmark($name, $iterations, $action);
}
//END

내가 그것을하고 있었기 때문에 일반적으로 count () / empty ()와 관련된 작업을 수행하는 성능을 확인하려고했습니다.

PHP 5.4.39 사용 :

Empty empty() 0.118691
Empty count() 0.218974
Full empty() 0.133747
Full count() 0.216424
IF empty empty() 0.166474
IF empty count() 0.235922
IF full empty() 0.120642
IF full count() 0.248273
OR empty empty() 0.123875
OR empty count() 0.258665
OR full empty() 0.157839
OR full count() 0.224869
IF/ELSE empty empty() 0.167004
IF/ELSE empty count() 0.263351
IF/ELSE full empty() 0.145794
IF/ELSE full count() 0.248425
( ? : ) empty empty() 0.169487
( ? : ) empty count() 0.265701
( ? : ) full empty() 0.149847
( ? : ) full count() 0.252891

HipHop VM 3.6.1 (dbg) 사용

Empty empty() 0.210652
Empty count() 0.212123
Full empty() 0.206016
Full count() 0.204722
IF empty empty() 0.227852
IF empty count() 0.219821
IF full empty() 0.220823
IF full count() 0.221397
OR empty empty() 0.218813
OR empty count() 0.220105
OR full empty() 0.229118
OR full count() 0.221787
IF/ELSE empty empty() 0.221499
IF/ELSE empty count() 0.221274
IF/ELSE full empty() 0.221879
IF/ELSE full count() 0.228737
( ? : ) empty empty() 0.224143
( ? : ) empty count() 0.222459
( ? : ) full empty() 0.221606
( ? : ) full count() 0.231288

PHP를 사용하는 경우 결론 :

  1. empty ()는 비어 있고 채워진 배열을 사용하여 두 시나리오에서 count ()보다 훨씬 빠릅니다.

  2. count ()는 전체 또는 빈 배열과 동일하게 수행합니다.

  3. 간단한 IF 또는 부울 연산을 수행하는 것은 동일합니다.

  4. IF / ELSE는 (? :)보다 약간 더 효율적입니다. 중간에 표현식을 사용하여 수십억 번의 반복을 수행하지 않는 한 완전히 중요하지 않습니다.

HHVM을 사용하는 경우 결론 :

  1. empty ()는 count ()보다 조금 빠르지 만 그다지 중요하지 않습니다.

    [나머지는 PHP와 동일합니다.]

결론적으로, 배열이 비어 있는지 알 필요가 있다면 항상 empty ();

이것은 많은 것을 고려하지 않고 단순히 행해진 호기심 많은 테스트였습니다. 이는 개념 증명 일 뿐이며 프로덕션 작업을 반영하지 않을 수 있습니다.


답변

개인적인 취향 일 뿐이라고 생각합니다. 어떤 사람들 empty은 더 빠르다고 말할 수도 있고 (예 : http://jamessocol.com/projects/count_vs_empty.php ) 다른 사람들 count은 원래 배열 용으로 만들어 졌기 때문에 더 낫다고 말할 수도 있습니다. empty더 일반적이며 다른 유형에 적용될 수 있습니다.

php.net은 다음과 같은 경고를 제공합니다 count.

count ()는 설정되지 않은 변수에 대해 0을 반환 할 수 있지만 빈 배열로 초기화 된 변수에 대해서는 0을 반환 할 수도 있습니다. 변수가 설정되었는지 테스트하려면 isset ()을 사용하십시오.

즉, 변수가 설정되지 않은 경우 PHP에서 정의되지 않았다는 알림을 받게됩니다. 따라서 사용하기 전에를 사용 count하여 변수를 확인하는 것이 좋습니다 isset. 에서는 필요하지 않습니다 empty.


답변

배열이 비어 있는지 여부를 결정할 때 비어있는 대신 count를 사용해야하는 이유가 있습니까?

비어 있지 않은 배열에서 크기를 알고 있어야 할 때가 있습니다.

if( 0 < ( $cnt = count($array) ) )
{
 echo "Your array size is: $cnt";
}
else
 echo "Too bad, your array is empty :(";

그러나 카운트를 사용하는 것이 100 % 확실하지 않으면 카운트를 사용하지 않는 것이 좋습니다. 최근에 나는 오류 함수가 FALSE빈 배열 대신 반환되는 코드를 디버깅 하고 있으며 발견 한 것은 다음과 같습니다.

var_dump(count(FALSE));

산출:

int 1

그래서 그 이후로 내가 사용하고 empty또는 if(array() === $array)확인 내가 가지고로 배열 비어 있습니다.


답변

count().NET Framework를 구현하는 배열과 유사한 인터페이스에서 더 잘 작동하는 것 같습니다 ArrayAccess/Countable. empty()이러한 종류의 개체에 요소가없는 경우에도 true를 반환합니다. 일반적으로 이러한 클래스는 Countable인터페이스 를 구현 하므로 “이 컬렉션에 요소가 포함되어 있습니까?”라는 질문이있는 경우 구현에 대해 가정하지 않고 count()더 나은 옵션입니다.


답변

또는 변수를 부울 (암시 적 또는 명시 적)로 캐스팅 할 수 있습니다.

if( $value )
{
  // array is not empty
}

if( (bool) $value )
{
  // array is still not empty
}

이 메소드 E_NOTICE는와 유사하게 변수가 정의되지 않은 경우를 생성합니다 count().

자세한 내용 은 유형 비교에 대한 PHP 매뉴얼 페이지를 참조하십시오 .


답변

개인적으로 선호하는 것은 코딩 우아함을 선호합니다 (특정 사용 사례와 관련하여). 문제의 테스트에 대해 count ()가 올바른 데이터 유형 (이 경우 부울)으로 응답하지 않아 개발자가 ‘if’문을 채우기 위해 더 많은 코드를 작성해야한다는 점에서 Dan McG에 동의합니다.

이것이 성능에 중대한 영향을 미치는지 여부는 매우 큰 어레이에서만 논란의 여지가 있습니다 (대부분의 설정에서 어쨌든 충분한 메모리 할당이 없을 것입니다).

특히 PHP의 $ _POST 배열에 관해서는 다음과 같이 작성 / 참조하는 것이 훨씬 더 “논리적”인 것 같습니다.

if ( !empty ( $_POST ) ) {
    // deal with postdata
}