「 a PHP配列が空であるかどうかを判断する方法 」に関するこの質問には、この質問について考えさせられました
配列が空かどうかを判断するときに、count
の代わりにempty
を使用する必要がある理由はありますか?
私の個人的な考えは、空の配列の場合に2が等しい場合、empty
を使用する必要があることです。これは、ブール質問に対するブール答えを与えるためです。上記のリンクの質問から、count($var) == 0
が一般的な方法であるようです。技術的には正しいが、私には意味がありません。例えば。 Q:$ var、空ですか? A:7。うーん...
代わりに_count == 0
_を使用する必要があるのですか、それとも個人的な好みの問題ですか?
削除された回答のコメントで他の人が指摘したように、count
はすべての要素をカウントする必要があるため、大きな配列のパフォーマンスに影響を与えますが、empty
はそれを知るとすぐに停止できます空ではありません。したがって、この場合に同じ結果が得られるが、count
が非効率的である可能性がある場合、なぜcount($var) == 0
を使用するのでしょうか。
通常、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を使用している場合の結論:
empty()は、両方のシナリオでcount()よりもはるかに高速で、空の配列が設定されています
count()は、フル配列または空の配列で同じことを実行します。
単純なIFまたはブール演算を行うことは同じです。
IF/ELSEは(?:)よりもわずかに効率的です。途中で式を使用して何十億回も繰り返し実行しない限り、まったく意味がありません。
HHVMを使用している場合の結論:
empty()はcount()よりも少し高速ですが、それほど重要ではありません。
[残りはPHP]と同じです
結論の結論として、配列が空かどうかを知る必要がある場合は、常にempty()を使用します。
これは、多くのことを考慮せずに単純に行われた奇妙なテストでした。これは単なる概念実証であり、本番環境での操作を反映していない場合があります。
個人的な好みだと思います。ある人は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があることを確認しています。
count()
は、_ArrayAccess/Countable
_を実装する配列のようなインターフェイスでよりうまく機能するようです。 empty()
は、これらの種類のオブジェクトに要素がない場合でもtrueを返します。通常、これらのクラスはCountable
インターフェイスを実装するため、質問が「このコレクションに要素が含まれていますか?」実装についての仮定をせずに、count()
がより良いオプションです。
または、変数をブール値として(暗黙的または明示的に)キャストできます。
_if( $value )
{
// array is not empty
}
if( (bool) $value )
{
// array is still not empty
}
_
このメソッドは、変数が定義されていない場合、count()
と同様に_E_NOTICE
_を生成します。
詳細については、 PHP型比較のマニュアルページ を参照してください。
私の個人的な好みは、(私の特定のユースケースに関連して)優雅さをコーディングすることです。問題のテストに対してcount()が正しいデータ型(この場合はブール値)で応答していないという点で、Dan McGに同意します。
これがパフォーマンスに重大な影響を与えるかどうかは、非常に大きなアレイについてのみ議論の余地があります(ほとんどのセットアップでは、おそらく十分なメモリ割り当てがおそらくないでしょう)。
特に、PHPの$ _POST配列に関しては、私の意見では次のように記述/表示する方がはるかに「論理的」に思えます。
if ( !empty ( $_POST ) ) {
// deal with postdata
}
これが既に回答されている(そして何が議論されている)としても、これが誰かの助けになることを願っています。私自身のシナリオでは、すべての配列にすべて7つの要素があり(コードで以前にチェックが行われた)、array_diff
もちろん、等しい場合はゼロの配列を返します。
count
で34秒、empty
で17秒でした。どちらも同じ計算を行うため、コードはまだ問題ありません。
ただし、==
または ===
as PHP-2つの配列が等しいかどうかを確認する 。私が言うベストは、count
vs empty
vs == empty array
、それからあなた自身の最高のパフォーマンスを与えるものを見てください。私の場合、count
が最も遅いので私はempty
nowを使用しています... serialize
next
空の使用は必須です。たとえば、次のコード:
$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?
count($myArray) == 0
よりもempty($myArray)
を好む強い理由はありません。これらのセマンティクスは同じです。あるものが他のものより読みやすいと感じるかもしれません。 1つは他よりもわずかに優れているかもしれませんが、それはほとんどのphpアプリケーションで重要な要因になる可能性は低いです。すべての実用的な目的のために、選択は好みの問題です。
負として解析された変数は、int(1)
とともにcount()
を返すため、
空の配列をテストするために_($array === [] || !$array)
_を好みます。
はい、空の配列を期待する必要がありますが、強制的な戻り値型のない関数の適切な実装を期待すべきではありません。
count()
の例
_var_dump(count(0));
> int(1)
var_dump(count(false));
> int(1)
_
私は心の人を作り直しました、ありがとう。
わかりました。empty
とcount
の使用に違いはありません。技術的には、count
は配列に使用する必要があり、empty
は文字列だけでなく配列にも使用できます。そのため、ほとんどの場合、それらは交換可能であり、phpドキュメントを見ると、count
にいる場合はempty
の提案リストが表示され、逆も同様です。