6663


早速本題なのですが  
頭から詰められている(添え字の0から順に格納されている)配列を作成した場合、  
`if(0<count($arr))` or `if(isset($arr[0]))`  
どちらがいいでしょうか？  
理由も添えて回答頂けると助かります。

この質問をするに至った経緯が日単位で数千～数万のアクセスが想定される環境があり、  
"少しでも最適化したい。"となった際に意見が出たので……。  
勿論、この他にもベストなチェックがあればご教授下さい。

追記：  
秒間100PVほどアクセスがある可能性が有ります。  
サーバースペックについてはお話しできませんが、それを想定されたスペックではあります。


CC BY-SA 3.0
2015-02-18T01:01:12.547
6658
2015-02-18T02:50:01.917
2015-02-18T02:50:01.917
7676
7676
question
php
ある条件下での配列の存在チェックで最適な物はドレ?


「頭から詰められている配列」の意味がよく分かりませんが…  
配列が空でないことをチェックするなら`if(0<count($arr))`で良いと思います。

`if(isset($arr[0]))`だと、`$arr = [1 => 'a', 2 => 'b'];`のような場合、真になりません。


CC BY-SA 3.0
2015-02-18T01:21:15.147
6660
2015-02-18T01:21:15.147
2232
6658
answer


配列の添え字が必ず 0 から始まるような状況であれば、どちらでもいいと思います。

前後のコードがありませんので推測でしかありませんが、そもそもこの配列ですら動的に作っているのでしたら以下のコードをお勧めします。

`if( is_array($arr) && !empty($arr) )`

理由は、添え字が 0 から始まらない場合でも配列であることが保障できますし、中身が空ではないことも保障できます。

日に数千～数万というのは、PV の話でしょうか。それとも DAU でしょうか？

PV としてお話しますが、サーバスペックが掲載されていませんので具体的な話はできませんが  
日に 50000 PV だとしても、ピーク時間で多く見積もっても 1 時間あたり 10000 人に届かないぐらいですよね。  
秒間 3 人ほどの閲覧であれば、何の支障にもならないと思いますし、こういった細かいところを最適化する意味はないと思います。


CC BY-SA 3.0
2015-02-18T01:23:27.057
6661
2015-02-18T01:32:49.607
2015-02-18T01:32:49.607
7926
7926
6658
answer


本件の直接的な回答にはならないかもしれないので恐縮ですが、  
面白いサイトがありましたのでここで紹介させていただきます。

My PHP Performance Benchmarks  
<http://maettig.com/code/php/php-performance-benchmarks.php>  
「Check if an Array is empty」というのがありますが、  
phpのバージョンが古い（version 5.2.17）ようです。

The PHP Benchmark  
<http://www.phpbench.com/>  
こちらは「isSet() vs. empty() vs. is_array()」の比較がありました。

本家SOでは「count vs empty」でemptyを使用するがベストアンサーに選ばれていました。  
※countの場合は配列のサイズでオーバヘッドが大きくなるっぽいことが書いてありました。  
<https://stackoverflow.com/questions/2216110/checking-for-empty-arrays-count-
vs-empty>

「An empty array is equal to false in PHP - no need for empty() or count().」  
こんなコメントもついています。

蛇足ですが、「empty」と「isset」は挙動が異なるので注意が必要です。  
公式リファレンスによると「empty() は本質的に !isset($var) || $var == false と同じ」とのことです。  
<http://php.net/manual/ja/function.empty.php>


CC BY-SA 3.0
2015-02-18T01:46:09.073
6663
2015-02-18T01:46:09.073
2017-05-23T12:38:55.307
-1
3516
6658
answer