Різниця між array_push () та $ array [] =


117

У посібнику PHP ( array_push ) сказано ..

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

Наприклад :

$arr = array();
array_push($arr, "stackoverflow");
print_r($arr);

проти

$arr[] = "stackoverflow";
print_r($arr);

Я не розумію, чому є велика різниця.


8
Один - це виклик функції, інший - ні. Точно те, що зазначено у вікні.
KingCrunch

1
Один - це виклик функції, як згадувалося вище, що означає використання деяких ресурсів для перемикання управління на / з виклику функції (таким чином, це призвело до накладної обробки). Тоді як, пізніше, це просто призначення нового елемента в масив відразу.
Ghazanfar Mir

2
це питання врятувало мене багато часу, підштовхуючи до масивів :)
RozzA

Відповіді:


151

Коли ви викликаєте функцію в PHP (наприклад, array_push()), виклик має накладні витрати, оскільки PHP повинен шукати посилання на функцію, знаходити її положення в пам'яті та виконувати будь-який код, який він визначає.

Використання $arr[] = 'some value';не вимагає виклику функції та реалізує додавання прямо в структуру даних. Таким чином, додаючи багато даних, це набагато швидше та ресурсніше використовувати $arr[].


3
що робити, якщо таке позначення "$ arr [] = 'деяке значення"; " зводиться до виклику функції?
Тебе

1
@gekannt Як би це сталося? Ви маєте на увазі, якщо "якесь значення" у вашому коментарі є закриттям? Це збереже посилання на закриття в масив. Якщо ви маєте на увазі, що "деяке значення" - це функція, яка викликається, вона додасть те, що ця функція повертає.
Кіркленд

@Kirkland Оператори - це лише функції з альтернативним синтаксисом на більшості мов, подібних до С, я не експерт PHP, але можу уявити, що вони реалізували оператори так само, оскільки це діалект С.
Кевін

1
@Kevin: ти погоджуюся з тобою, і я впевнений, що за альтернативним синтаксисом є функція, це не та, яка була зазначена вище, оскільки я бачу наступний коментар у документації на php: "Якщо ви використовуєте array_push () для додавання одного елемента для масиву краще використовувати $ array [] = тому що таким чином немає накладних витрат виклику функції. " Не
встигайте

Чи є фактичні докази, які $arr[] = valueшвидше? Намагаючись уявити, чому компілятор буде по-різному ставитися до коду.
с ..

44

Ви можете додати більше одного елемента в один кадр до масиву, використовуючи array_push,

напр array_push($array_name, $element1, $element2,...)

Де $ element1, $ element2, ... - елементи, які потрібно додати до масиву.

Але якщо ви хочете додати лише один елемент одночасно, слід віддавати перевагу іншому методу (тобто, використовуючи $ array_name []).


Чи погана практика поєднувати ці два за потребою протягом проекту?
PBwebD

1
@ testing123 Абсолютно ні. Доброю практикою є використання найефективнішого рішення, доступного під рукою, якщо це не суттєво калічить читабельність, сумісність тощо (або якщо вам потрібно дотримуватися певних настанов стилю).
Кріс Крашевський

15

Різниця полягає в рядку нижче "тому, що таким чином немає накладних витрат виклику функції".

array_push()підніме попередження, якщо перший аргумент не є масивом. Це відрізняється від $var[]поведінки, де створюється новий масив.


4
Я не сказав, що це була причина. У питанні було задано різницю, і це теж різниця
Байг

7

Ви завжди повинні використовувати, $array[]якщо це можливо, оскільки, як зазначено у полі, немає накладних витрат для виклику функції. Таким чином, це трохи швидше, ніж виклик функції.


4

array_push - натисніть один або кілька елементів на кінець масиву

Візьміть до уваги слова " один або кілька елементів до кінця ", щоб зробити це, використовуючи, $arr[]вам доведеться отримати максимальний розмір масиву


Знову "щоб зробити це за допомогою $ arr [], вам доведеться отримати максимальний розмір масиву" . Ні, ви плутаєте $arr[...index...] = $value;те, що тут обговорюється, що є $arr[] = $value;. Не потрібно знати розмір або масив, щоб натиснути на кінець. Кілька елементів будуть просто кілька викликів: $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

Поясніть: 1.перше оголошуйте змінну в масиві.

2.другий метод array_push використовується для натискання рядка в змінній масиву.

3. остаточно він надрукує результат.

4.другий метод - безпосередньо зберігати рядок у масиві.

5.дані друкуються у значеннях масиву за допомогою методу print_r.

це двоє однакові


1

обидва однакові, але array_push робить цикл у своєму параметрі, який є масивом та виконує $ array [] = $ елемент


0

Я знаю, що це стара відповідь, але може бути корисно для інших знати, що ще одна різниця між ними полягає в тому, що якщо вам доведеться додати до масиву більше 2/3 значень за цикл, це швидше використовувати:

     for($i = 0; $i < 10; $i++){
          array_push($arr, $i, $i*2, $i*3, $i*4, ...)
     }

замість:

     for($i = 0; $i < 10; $i++){
         $arr[] = $i;
         $arr[] = $i*2;
         $arr[] = $i*3;
         $arr[] = $i*4;
         ...
     }

редагувати- Забув закрити дужку для forумовного


1
Цікаво, як це порівнюється з array_merge. Напр for(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }. Я думаю, що array_push все ще трохи швидше, ніж це.
ToolmakerSteve

0

Ніхто не сказав, але array_push лише підштовхує елемент до кінця масиву, де $ array [index] може вставити значення в будь-який даний індекс. Велика різниця.


Питання полягало у тому, що "Різниця між array_push () та $ array [] =" те, що я сказав, - одна різниця. Великий!
Марко

1
Я з повагою не згоден. Ви описуєте $array[index] = , що це інша операція, ніж $array[] = .... Питання дає два фрагменти коду і запитує, чому між ними була б значна [продуктивна] різниця . Питання буквально означає $array[] = ..., що це специфічна ідентифікація php, яка не включає індекс. масив + індекс вирішує іншу задачу, дає різний код і є різним компромісом.
ToolmakerSteve
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.