PHP配列:countまたはsizeof?


216

PHPの要素の数を見つけるには$array、どちらが高速/優れている/強力ですか?

count($array)またはsizeof($array)

編集する

Andy Lesterのおかげで、多言語の観点から意味するように質問を洗練させました。手動コメンターは言う

「[sizeof]は、Cに基づく他の多くの言語で同じことを意味するものではありません。」

これは本当ですか?


72
Daft Punkのリファレンス... :)
Ben

2
とてもいい質問です。しかし、ここに良いベンチマークサイトがあります。これは、sizeofがわずか21µs速いということです
サイナッカー

回答:


191

count()私の経験ではより一般的であるので、それらが同じ場合に使用します。そのため、コードを読んでいる開発者が " sizeof()、それは何ですか?" と言うことが少なくなります。とドキュメントを参照する必要があります。

sizeof()Cのように機能しない(データ型のサイズを計算する)という意味だと思います。これはおそらく、PHPはCで書かれているので、明示的にこの言及し、およびC関数のための同じ名前のラッパー(たくさんの提供strlen()printf()など)


92

phpbenchによると:

ループの長さを事前に計算しておく価値はありますか?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}

1バイトの値を持つ1000個のキーを持つループが提供されます。

                  +---------+----------+
                  | count() | sizeof() |
+-----------------+---------+----------+
| With precalc    |     152 |      212 |
| Without precalc |   70401 |    50644 |
+-----------------+---------+----------+  (time in µs)

したがって、私はpre calcsizeof()ではなくcount()を使用することを個人的に好みます。


3
時間が短い方のみ教えてください。そうでなければ、答えはかなり複雑で混乱します!ありがとう
Pratik、2015

6
どのバージョンのphpをテストしましたか?新しいバージョンには多くの最適化があり、これらの結果がかなり異なる可能性があります
John Hunt

4
結果を変数に保存せずにsizeofの方が速いのはなぜですか?それ以外の場合は逆になりますか?これは、ある種の選択的なオーバーヘッドを引き起こすphpインタープリターの悪い設計選択ですか?あなたがこれをどのようにベンチマークしたか知りたいのですが、マイクロ秒の測定は私を心配します。おそらく、これを外側のforループで何度も実行してみてください。
FluorescentGreen5

1
「事前計算」とはどういう意味ですか?
rubo77

1
@ rubo77上記のコードを参照してください。「事前計算」は、forループの前に、配列のサイズを1回決定します。「事前計算」なしでは、forループ内の配列のサイズが決定されます
RobIII

38

それらは同じです sizeof()

「より速く」を心配する理由がない場合は、常に人間に最適化してください。人間の読者にとってどちらがより理にかなっていますか?


19

ウェブサイトによるsizeof()と、はのエイリアスなcount()ので、同じコードを実行している必要があります。sizeof()それを解決する必要があるため、おそらくオーバーヘッドが少しありますcount()か?それは非常に最小限でなければなりません。


53
さて、ごめんなさい?私はちょうど彼らが実際には同じものであると述べていました。次に、実際の関数の代わりに関数のエイリアスを使用すると、速度が非常に遅くなる可能性があることを論理的に推論しましたが、「おそらく」という単語を前に付けることで、私には本当にわからないことを認めました。それがあなたを怒らせたら申し訳ありません。次回は「無限小」という言葉を使うかもしれません。
Andy Groff、

8

私はこれが古いことを知っていますが、私がこれをPHP 7.2で試したことを述べたいだけです。

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>

そして結果は:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec

したがって、を使用してくださいcount()


これは面白い。どのPHPバージョンを使用していますか?
ワザ2018

@waza私はPHP 7.2を使用しています
Mehdi Bounya 2018

1
PHP 7.3.3の場合: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB


-2

カウント関数を使用してください、これは要素の配列をカウントする方法の例です

$cars = array("Volvo","BMW","Toyota");
echo count($cars);

このcount()関数は、配列内の要素の数を返します。

このsizeof()関数は、配列内の要素の数を返します。

sizeof()機能はの別名であるcount()機能。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.