Що краще використовувати в PHP, $ array [] = $ value або array_push ($ array, $ value)?


113

Що краще використовувати в PHP для додавання члена масиву,

$array[] = $value;

або

array_push($array, $value);

?

Хоча в посібнику сказано, що вам краще уникнути виклику функції, я також читав $array[]набагато повільніше, ніж array_push(). Які роз'яснення чи орієнтири?


2
$ myArray [] = 123; Це буде швидше, ніж функція array_push. Це безпосередньо додає значення в цей масив. Функція має окремий стек для цих змінних. і він може мати це твердження всередині цієї функції.
sganesh

Відповіді:


151

Жодних орієнтирів немає, але я особисто вважаю, що $array[]це чистіше дивитись, і чесно розщеплювати волосся протягом мілісекунд - це зовсім не має значення, якщо ви не плануєте додавати сотні тисяч рядків до свого масиву.

Редагувати : Запустити цей код:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

Перший спосіб використання $array[]майже на 50% швидший, ніж другий.

Деякі результати:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

Це не дивно, оскільки керівництво PHP відзначає це:

Якщо ви використовуєте array_push () для додавання одного елемента до масиву, краще використовувати $ array [] =, оскільки таким чином немає накладних витрат виклику функції.

Те, як це висловлено, я не здивуюсь, якщо array_pushефективніше додавати декілька значень. EDIT : З цікавості зробили додаткові тести, і навіть для великої кількості доповнень, індивідуальні $array[]дзвінки швидше, ніж один великий array_push. Цікаво.


Я завжди вважаю за краще знати, який найшвидший спосіб, тому, коли настане день, мені запропонують створити сайт з високим трафіком, я маю деяке розуміння. Дякую за відповідь.
alex

10
Такі мікрооптимізації рідко варті зусиль. Якщо ви пишете це з нуля, робіть це, як це має найбільше сенс, і лише тоді, якщо створювати сторінку трохи повільно, профіліруйте її. Шанси домогтися повного зменшення необхідності змінити щось подібне, щоб прискорити роботу, невеликі.
Алістер Бульман

4
Просто для того, щоб переконатися, оскільки код здається невідповідним результатам, я переконався, що $array[]це дійсно набагато швидше, 300 мс проти 2000 мс для 1М завдань на моїй машині. Однак додавання одразу 20 елементів у array_push пройшло приблизно так само швидко, як 20 $array[] =с.
Елле

5
@AlisterBulman Мікрооптимізація не вартує зусиль, якщо ви думаєте про те, щоб повернутися через всю вашу кодову базу та "оптимізувати" її. Однак якщо у вас є кілька різних способів зробити те саме, і ви усвідомлюєте, що один спосіб краще (навіть просто небагато), ніж інші, ви можете змусити його використовувати такий спосіб. Чому б ти цього не зробив?
Okonomiyaki3000

2
@AlisterBulman Я мушу категорично не погоджуватися або хоча б частково, якщо ви знаєте краще, пишіть краще , але не докладайте великих зусиль для пошуку можливої мікрооптимізації ...
jave.web

42

Основне використання array_push () полягає в тому, що ви можете натиснути кілька значень на кінець масиву.

Він каже , що в документації :

Якщо ви використовуєте array_push () для додавання одного елемента до масиву, краще використовувати $ array [] =, оскільки таким чином немає накладних витрат виклику функції.


29

З PHP-документів дляarray_push :

Примітка: Якщо ви використовуєте array_push () для додавання одного елемента до масиву, краще використовувати $ array [] =, оскільки таким чином немає накладних витрат виклику функції.


Смішно, як спочатку була ваша відповідь, але про це менше голосували.
T.Woody

21

Слово на вулиці полягає в тому, що [] швидше, оскільки немає накладних витрат на виклик функції. Крім того, ніхто не любить функції масиву PHP ...

"Це ... стог сіна, голка .... чи це голка стога сіна ... ах, е *** це ... [] ="


7
Так? Функції масиву PHP є приголомшливими.
клент

13
Функціонально вони приголомшливі, так, але він мав на увазі суперечливу схему іменування.
ryeguy

2
Вам слід увімкнути підказку параметрів у IDE. Але я згоден, деяка послідовність була б чудовою.
Пім Джагер

4
Я з цим згоден. Немає узгодженості ні в схемі іменування (x_y, xy чи y_x ...), ні в логіці параметрів (передайте цільовий об’єкт спочатку, останнє, між масивами, рядками та регулярними виразами, удачі, щоб знайти загальне правило!).
e2-e4

3
FWIW, мені подобається конвенція про іменування голки / копиці сіна , і мені легко запам'ятовується, оскільки це йде в тому ж порядку, що і фраза: "як знайти голку (1) в копиці сіна (2)"
rybo111,

8

Одна відмінність полягає в тому, що ви можете викликати array_push () з більш ніж двома параметрами, тобто ви можете одночасно натискати на масив більше одного елемента.

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

відбитки 1,2,3,4


2

Проста декларація $ myarray [] буде швидшою, оскільки ви просто натискаєте елемент на стек елементів через відсутність накладних витрат, які може принести функція.


2

Оскільки " array_push " - це функція, і вона викликається кілька разів, коли вона знаходиться всередині циклу, тому вона виділить пам'ять у стек. Але коли ми використовуємо $ array [] = $ value, ми просто присвоюємо значення масиву.


1

Другий - це виклик функції, тому він, як правило, повинен бути повільніше, ніж використання основних функцій доступу до масиву. Але я думаю, що навіть один запит до бази даних у вашому сценарії перевищить 1 000 000 дзвінків array_push().


0

Хоча питання стосувалося продуктивності, люди прийдуть до цього питання, цікавлячись, чи це хороша практика використання array_pushчи $arr[].

Функція може означати менші рядки для кількох значень:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

Тим НЕ менше , array_push...

  • не може отримати ключі масиву
  • ламає умову іменування голки / сіна
  • повільніше, як уже говорилося

Я буду дотримуватися $arr[].


0

Я просто не хочу додати: int array_push(...)повернути нову кількість елементів у масиві ( php doc ). що може бути корисним і більш компактним, ніж $myArray[] = ...; $total = count($myArray);.

Також array_push(...)має сенс, коли змінна використовується як стек.

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