PHP-масив: кількість чи розмір?


216

Щоб знайти кількість елементів у PHP $array, яка швидша / краща / сильніша?

count($array)або sizeof($array)?

Редагувати

Завдяки Енді Лестеру я уточнив, що моє питання означає з багатомовної точки зору. Кажуть ручні коментатори

"[sizeof] не означає те ж саме для багатьох інших мов на основі C"

Це правда?


72
Посилання на Daft Punk ... :)
Бен

2
Дуже приємне запитання. Але ось хороший орієнтир, який говорить, що розмір просто на 21 мкс швидший
sinaneker

Відповіді:


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);
    //...
}

Наведено цикл з 1000 клавішами з 1 байтовим значенням.

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

Тож я особисто вважаю за краще використовувати count () замість sizeof () з попереднім обчисленням .


3
Скажіть, будь ласка, лише те, що займає менше часу. Ще одна відповідь є досить складною і заплутаною! Спасибі
Пратік

6
з якою версією php ви тестували? Новіші версії мають багато оптимізацій, які можуть зробити ці результати зовсім іншими
Джон Хант

4
Чому розмір швидше, не зберігаючи його результат у змінну, але в іншому випадку - навпаки? це якийсь поганий вибір дизайну в інтерпретаторі php, який викликає якусь селективну накладні витрати? Я хотів би знати, як ви це оцінювали, мене хвилює мікросекундне вимірювання. можливо, спробуйте запустити це величезна кількість разів у зовнішній для циклу?
FluorescentGreen5

1
що ви маєте на увазі під "pre calc"?
rubo77

1
@ rubo77 Дивіться вищевказаний код; "pre-calc" - це визначити розмір масиву один раз, перед циклом for. Без "попереднього обчислення" визначається розмір масиву всередині for-loop
RobIII

38

Вони однакові згідно sizeof()

За відсутності будь-яких причин турбуватися про «швидше», завжди оптимізуйте для людини. Що має більше сенсу для людського читача?


19

За даними веб-сайту, sizeof()це псевдонім count(), тому вони повинні працювати з тим самим кодом. Можливо, sizeof()є трохи накладних витрат, тому що це потрібно вирішити count()? Це повинно бути дуже мінімальним.


53
Ну, вибачте за здогадки? Я просто заявив, що вони насправді те саме. Тоді я зробив логічне висновок, що використання псевдоніма для функції замість фактичної функції може бути дуже мінімально повільним, але я зізнався, що я насправді не маю уявлення, зробивши це слово "можливо". Вибачте, якщо це образило вас. Можливо, наступного разу я вживаю слово "нескінченно малий".
Енді Грофф

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 ви використовуєте?
waza

@waza Я використовую PHP 7.2
Mehdi Bounya

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

Будь ласка, використовуйте функцію count, Ось приклад, як рахувати масив в елементі

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

count()Функція повертає кількість елементів в масиві.

sizeof()Функція повертає кількість елементів в масиві.

sizeof()Функція є псевдонімом count()функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.