web-dev-qa-db-ja.com

空の配列の確認:カウントvs空

a PHP配列が空であるかどうかを判断する方法 」に関するこの質問には、この質問について考えさせられました

配列が空かどうかを判断するときに、countの代わりにemptyを使用する必要がある理由はありますか?

私の個人的な考えは、空の配列の場合に2が等しい場合、emptyを使用する必要があることです。これは、ブール質問に対するブール答えを与えるためです。上記のリンクの質問から、count($var) == 0が一般的な方法であるようです。技術的には正しいが、私には意味がありません。例えば。 Q:$ var、空ですか? A:7。うーん...

代わりに_count == 0_を使用する必要があるのですか、それとも個人的な好みの問題ですか?

削除された回答のコメントで他の人が指摘したように、countはすべての要素をカウントする必要があるため、大きな配列のパフォーマンスに影響を与えますが、emptyはそれを知るとすぐに停止できます空ではありません。したがって、この場合に同じ結果が得られるが、countが非効率的である可能性がある場合、なぜcount($var) == 0を使用するのでしょうか。

92
Dan McGrath

通常、emptyを使用します。なぜ人々が本当にカウントを使用するのかわからない-配列が大きい場合は、カウントに時間がかかります/オーバーヘッドが増えます。配列が空かどうかを知る必要がある場合は、空を使用します。

92
prodigitalson

どちらが実際に高速かを知りたいので、これらの関数のベンチマークを行う簡単なスクリプトを作成しました。

<?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()を使用します。

これは、多くのことを考慮せずに単純に行われた奇妙なテストでした。これは単なる概念実証であり、本番環境での操作を反映していない場合があります。

43
Satake

個人的な好みだと思います。ある人はemptyが速いと言うかもしれません(例 http://jamessocol.com/projects/count_vs_empty.php )が、ある人はcountのほうが優れていると言うかもしれませんもともと配列用に作られました。 emptyはより一般的であり、他のタイプに適用できます。

php.netでは、countに対して次の警告が表示されます。

count()は、設定されていない変数に対して0を返す場合がありますが、空の配列で初期化された変数に対して0を返す場合もあります。 isset()を使用して、変数が設定されているかどうかをテストします。

言い換えると、変数が設定されていない場合、PHPは未定義であるという通知を受け取ります。したがって、countを使用する前に、変数を確認することをお勧めします。 with 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)を使用して、空のarrayがあることを確認しています。

10

count()は、_ArrayAccess/Countable_を実装する配列のようなインターフェイスでよりうまく機能するようです。 empty()は、これらの種類のオブジェクトに要素がない場合でもtrueを返します。通常、これらのクラスはCountableインターフェイスを実装するため、質問が「このコレクションに要素が含まれていますか?」実装についての仮定をせずに、count()がより良いオプションです。

6
Ryan

または、変数をブール値として(暗黙的または明示的に)キャストできます。

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

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

このメソッドは、変数が定義されていない場合、count()と同様に_E_NOTICE_を生成します。

詳細については、 PHP型比較のマニュアルページ を参照してください。

5
user212218

私の個人的な好みは、(私の特定のユースケースに関連して)優雅さをコーディングすることです。問題のテストに対してcount()が正しいデータ型(この場合はブール値)で応答していないという点で、Dan McGに同意します。

これがパフォーマンスに重大な影響を与えるかどうかは、非常に大きなアレイについてのみ議論の余地があります(ほとんどのセットアップでは、おそらく十分なメモリ割り当てがおそらくないでしょう)。

特に、PHPの$ _POST配列に関しては、私の意見では次のように記述/表示する方がはるかに「論理的」に思えます。

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

これが既に回答されている(そして何が議論されている)としても、これが誰かの助けになることを願っています。私自身のシナリオでは、すべての配列にすべて7つの要素があり(コードで以前にチェックが行われた)、array_diffもちろん、等しい場合はゼロの配列を返します。

countで34秒、emptyで17秒でした。どちらも同じ計算を行うため、コードはまだ問題ありません。

ただし、== または === as PHP-2つの配列が等しいかどうかを確認する 。私が言うベストは、count vs empty vs == empty array、それからあなた自身の最高のパフォーマンスを与えるものを見てください。私の場合、countが最も遅いので私はempty nowを使用しています... serialize next

3
xchiltonx

空の使用は必須です。たとえば、次のコード:

$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

したがって、空のglob出力をcountすると、誤った出力が得られます。空虚を確認する必要があります。

glob ドキュメントから:

一致したファイル/ディレクトリを含む配列、一致するファイルがない場合は空の配列、エラー時にFALSEを返します。
注:一部のシステムでは、空の一致とエラーを区別することはできません。

この質問も確認してください: なぜcount(false)return 1?

1
trante

count($myArray) == 0よりもempty($myArray)を好む強い理由はありません。これらのセマンティクスは同じです。あるものが他のものより読みやすいと感じるかもしれません。 1つは他よりもわずかに優れているかもしれませんが、それはほとんどのphpアプリケーションで重要な要因になる可能性は低いです。すべての実用的な目的のために、選択は好みの問題です。

1
Asaph

負として解析された変数は、int(1)とともにcount()を返すため、

空の配列をテストするために_($array === [] || !$array)_を好みます。

はい、空の配列を期待する必要がありますが、強制的な戻り値型のない関数の適切な実装を期待すべきではありません。

count()の例

_var_dump(count(0));
> int(1)
var_dump(count(false));
> int(1)
_
0
Sdlion

私は心の人を作り直しました、ありがとう。

わかりました。emptycountの使用に違いはありません。技術的には、countは配列に使用する必要があり、emptyは文字列だけでなく配列にも使用できます。そのため、ほとんどの場合、それらは交換可能であり、phpドキュメントを見ると、countにいる場合はemptyの提案リストが表示され、逆も同様です。

0
Sarfraz