Разница между 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 09

1
Один из них - это вызов функции, как упоминалось выше, что означает использование некоторых ресурсов для переключения управления на / из вызова функции (что привело к обработке накладных расходов). Тогда как позже просто сразу же присваивает массиву новый элемент.
Ghazanfar Mir

2
этот вопрос сэкономил мне много времени, нажимая на массивы :)
RozzA

Ответы:


151

Когда вы вызываете функцию в PHP (например, array_push()), есть накладные расходы на вызов, так как PHP должен искать ссылку на функцию, находить ее положение в памяти и выполнять любой код, который он определяет.

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


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

1
@gekannt Как это могло случиться? Вы имеете в виду, что "некоторая ценность" в вашем комментарии - это закрытие? Это сохранит ссылку на замыкание в массиве. Если вы имеете в виду, что «какое-то значение» - это вызываемая функция, она добавит все, что возвращает эта функция.
Kirkland

Операторы @Kirkland - это просто функции с альтернативным синтаксисом в большинстве C-подобных языков, я не эксперт по PHP, но могу представить, что они реализовали операторы таким же образом, поскольку это диалект C.
Кевин

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

Есть ли реальные доказательства того, что $arr[] = valueэто быстрее? Пытаемся представить, почему компилятор по-другому трактует код.
c ..

44

Вы можете добавить более 1 элемента за один снимок в массив с помощью array_push,

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

Где $ element1, $ element2, ... - элементы, которые нужно добавить в массив.

Но если вы хотите добавить только один элемент за раз, тогда предпочтительнее использовать другой метод (например, с использованием $ array_name []).


Является ли плохой практикой комбинировать и то и другое в рамках проекта?
PBwebD 03

1
@ testing123 Абсолютно нет. Рекомендуется использовать наиболее эффективное из имеющихся под рукой решение, если оно не сильно ухудшает удобочитаемость, совместимость и т. Д. (Или если вам нужно соблюдать определенные руководства по стилю).
Крис Крашевски

15

Разница в строке ниже: «потому что таким образом нет накладных расходов на вызов функции».

array_push()выдаст предупреждение, если первый аргумент не является массивом. Это отличается от $var[]поведения, при котором создается новый массив.


4
Я не сказал, что это была причина. В вопросе была задана разница, и это тоже разница
Baig

7

Вы должны всегда использовать, $array[]если это возможно, потому что, как указано в поле, нет накладных расходов на вызов функции. Таким образом, это немного быстрее, чем вызов функции.


4

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

Обратите внимание на слова « один или несколько элементов в конце », чтобы сделать это, $arr[]вам нужно будет получить максимальный размер массива.


Re: «чтобы сделать это с помощью $ 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 [] = $ element


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

edit - Забыл закрыть скобку для 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, не связанная с индексом. array + index решает другую проблему, дает другой код и представляет собой другой компромисс.
ToolmakerSteve
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.