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


98

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

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

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

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

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


나는 당신의 의도가 배타적으로 대화를 배열로 제한하는 것이라고 가정하고 있지만, 개체로 작업하는 경우 (예 : Countable, Iterator 등을 구현하는) 게임이 완전히 변경된다는 점에 주목할 가치가 있습니다.

8
빈 배열은 falsePHP에서와 같습니다 . empty()또는 필요하지 않습니다 count().
Cobby

@Cobby 코드주세요.
TheRealChx101

에서 TheRealChx101으로 @, 단지 수행 if (!$myArray) { echo "array is empty"; } sandbox.onlinephpfunctions.com/code/...
코비 (cobby) 타입

요즘 연결된 질문에서 인기있는 옵션은 empty().
PhoneixS

답변:


97

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


4
이러한 함수는 배열이 비어 있지 않을 때 실제로 다릅니다 .
Jacco

2
@Jacco : 나는 그것에 대해 이의를 제기하지 않습니다. 그러나 비어있는 것을 테스트하면 어떤 관련성이 있는지 알 수 없습니다. 함수가 반환 할 부울 결과가있는 질문입니다. 비어있는 것으로 간주되는 것과 관련하여 var가 배열이 아닌 경우에는 완전히 다른 문제가 아닌 한 해당 기준이 잘못된 답변을 생성하는 방법을 보지 마십시오.
prodigitalson 2010

23
@prodigitalson O(1)PHP가 내부적으로 요소의 수를 저장하기 때문에 count는라고 말하고 싶습니다 . 이 답변을 확인하십시오. stackoverflow.com/a/5835419/592454
elitalon

4
@eliton : 그러나 여전히-성능에 차이가 없거나 거의없는 경우에도 카운트가 필요하지 않으면 카운트를 사용하는 이유는 무엇입니까?
prodigitalson

4
empty ()는 오류를 너무 용서합니다. 수퍼 클래스의 개인 멤버 변수에서 empty ()를 테스트 한 서브 클래스를 디버깅하는 데 2 ​​시간을 보냈습니다 (슈퍼 클래스의 멤버 변수 범위는 보호되어야하지만 empty ()는 오류를 반환하지 않았습니다. 결과는 단순히 발생하지 않았습니다. 서브 클래스에 멤버 변수가 존재하지 않는 것은 마치이 멤버 변수 인 배열이 비어있는 것과 똑같은 방식으로 처리되었습니다. 즉, 요소가없는 것처럼 처리되었습니다. 이것은 문제가 있으며 PHP가 너무 관대하다는 또 다른 예입니다.
마태 복음 Slyman

46

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

<?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 ();

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


샘플 테스트 코드에 감사드립니다 .... 방금 사용했고 그게 if($x){더 빠르다는 것을 알았 습니다 if(empty($x)){( $x선언 된 것을 알고있는 경우에만 작동합니다 ).
Redzarf

테스트 코드가 정말 나쁩니다. 익명 함수 호출과 같은 많은 추가 항목을 추가합니다. 제거하고 베어 코드를 실행하면 (서로의주기를 위해) 큰 차이를 얻습니다. 어떤이있는 경우 그리고 나는 빨리이 경우 의미없는 countempty는 IF 문에 전화를. 그런 다음를 제공 empty하고 지속 count. 그러나 당신의 경우에 비해 비어있는 것은 10 배 더 빠릅니다! 간단한 배열 테스트 : 0.104662, 비어 있음 : 0.177659, 개수 : PHP 5.6에서 1.175125 그렇지 않으면 코드가이 버전에서도 언급 한 것과 동일한 결과를 제공합니다. 가짜 결과 일뿐입니다.
golddragon007

16

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

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

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

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


3
선호하는 인수 count가 원래 배열 용으로 만들어 졌다는 것이 흥미 롭습니다 . 그러나 객체는 구현할 Countable수 있으며 스칼라 값을에 전달 count()하고 유효한 결과를 얻을 수 있습니다.

1
계수 () 수도 설정되지 가변 0을 반환하지만 수도 또한 ... . 불확실성을 표현하기 위해 모달 동사를 사용하는 공식 문서 : p
nawfal

isset()요점 에 대한 의견입니다 . PHP의 알림이 걱정된다면 이미 배열을 선언 했어야합니다. PHP가 배열을 동적으로 선언하도록하면 그 시점에서도 알림을 받게됩니다. php.net에 대한 경고의 진짜 요점은 count배열이 선언되었는지 여부를 결정하는 데 사용하면 안된다는 것입니다. 빈 배열과 동일한 결과를 산출하기 때문입니다.
Noah Duncan

12

배열이 비어 있는지 여부를 결정할 때 비어있는 대신 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)확인 내가 가지고로 배열 비어 있습니다.


6

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


" 요소가 없더라도 이러한 종류의 객체에 대해 falseempty반환 "한다는 의미 입니까?
alexw

예. 클래스가 "비어 있는지"여부를 정의 할 수있는 인터페이스가 없습니다. 그리고 하나가 있다는 것은 정말 말이되지 않습니다.
라이언

+1 사용 count은 "일반적인"방식으로 구현 된 컬렉션을 코드에서 수용하는 것이 합리적이라면 더 유연하고 확장 가능한 솔루션이 될 것입니다. IMO는 사용 여부를 정의하는 유일한 적절한 기준이 될 수 있습니다 count...
ClemC 2019-04-19

count()7.2 의 큰 단점은 더 이상 빈 변수를 사용할 수 없다는 것입니다.
라이언

5

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

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

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

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

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


1
이것은 확인하는 가장 좋은 방법이며, empty()E_NOTICE (일반적으로 나쁜 생각, IMO)를 트리거하지 않으려는 경우 에만 사용 합니다. 빈을 노골적으로 사용하면 버그가있는 코드가 생성됩니다.
Cobby

3

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

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

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

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

3

이미 답변을 받았음에도 불구하고 누군가에게 도움이 될 수 있기를 바랍니다. 내 시나리오에서는 모든 배열에 7 개의 요소가 있다는 것을 알고 있으며 (내 코드에서 이전에 확인 했음) array_diff물론 같을 때 0 배열을 반환하는 작업을 수행하고 있습니다.

나는 34 초 동안 count, 17 초 동안 empty. 둘 다 동일한 계산을 제공하므로 내 코드는 여전히 괜찮습니다.

그러나 ==또는 PHP 에서 와 ===같이 시도 할 수도 있습니다 . 두 배열이 같은지 확인하십시오 . 내가 말하고 싶은 최선은 try countvs emptyvs == empty array, 어떤 것이 자신의 최고의 성능을 제공하는지 확인하는 것입니다. 제 경우 count에는 가장 느 렸기 때문에 지금 사용하고 empty있습니다 ... serialize다음에 확인할 것입니다


2

count($myArray) == 0보다 선호 할 강력한 이유가 없습니다 empty($myArray). 그들은 동일한 의미를 가지고 있습니다. 일부는 다른 것보다 더 읽기 쉬운 것을 찾을 수 있습니다. 하나는 다른 것보다 약간 더 나은 성능을 발휘할 수 있지만 대부분의 PHP 응용 프로그램에서 중요한 요소는 아닙니다. 모든 실용적인 목적에서 선택은 취향의 문제입니다.


1
"성능"은 어떻습니까? "실용적 목적"에 대한 설명을 사용하면 나쁜 습관이 생깁니다. count카운트가 필요할 때 사용 empty하고 컬렉션이 비어 있는지 확인해야 할 때 사용 합니다. 물론 문자열이나 널과 같은 경우가 있지만 프로그래머는 자신의 코드에 대해 생각할 필요가 있습니다. 동의하지 않을 수 있습니다.
Namek

때로는 count ($ myArray)를 사용하여 $ myArray가 FALSE 값과 같은 부울이면 카운트가 작동하지 않습니다 (php5.3에서 테스트 됨).
Mimouni

1

때로는 빈을 사용하는 것이 필수입니다. 예를 들어이 코드 :

$myarray = array();

echo "myarray:"; var_dump($myarray); echo "<br>";
echo "case1 count: ".count($myarray)."<br>";
echo "case1 empty: ".empty($myarray)."<br>";

$glob = glob('sdfsdfdsf.txt');

echo "glob:"; var_dump($glob); echo "<br>";
echo "case2 count: ".count($glob)."<br>";
echo "case2 empty: ".empty($glob);

이 코드를 다음과 같이 실행하면 : http://phpfiddle.org/main/code/g9x-uwi

이 출력을 얻습니다.

myarray:array(0) { } 
case1 count: 0
case1 empty: 1

glob:bool(false) 
case2 count: 1
case2 empty: 1

따라서 count빈 glob 출력이면 잘못된 출력을 얻습니다. 비어 있는지 확인해야합니다.

에서 글로브의 문서 :

일치하는 파일 / 디렉토리를 포함하는 배열을 반환합니다. 일치하는 파일이 없으면 빈 배열을, 오류가 발생하면 FALSE를 반환합니다.
참고 : 일부 시스템에서는 빈 일치와 오류를 구분할 수 없습니다.

또한 다음 질문을 확인하십시오. count (false)가 1을 반환하는 이유는 무엇입니까?


1

음수로 파싱 된 변수는 다음 int(1)과 같이 반환되므로count()

($array === [] || !$array)빈 배열을 테스트 하는 것을 선호 합니다.

예, 빈 배열을 예상해야하지만 강제 반환 유형이없는 함수에서 좋은 구현을 기 대해서는 안됩니다.

예제 count()

var_dump(count(0));
> int(1)
var_dump(count(false));
> int(1)

0

고마워요.

좋아,의 사용 사이에는 차이가 없다 empty하고 count. 기술적으로 count는 배열에 사용해야하며 empty문자열뿐만 아니라 배열에도 사용할 수 있습니다. 그래서 대부분의 경우, 그들은 상호 교환하고 PHP는 문서를 볼 경우, 당신의 제안 목록이 표시됩니다 count당신이에있는 경우 empty와 반대의 경우도 마찬가지.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.