Что лучше использовать в PHP: $ array [] = $ value или array_push ($ array, $ value)?


113

Что лучше использовать в PHP для добавления члена массива,

$array[] = $value;

или

array_push($array, $value);

?

Хотя в руководстве говорится, что вам лучше избегать вызова функции, я также читал, что $array[]он намного медленнее, чем array_push(). Какие есть уточнения или тесты?


2
$ myArray [] = 123; Это будет быстрее, чем функция array_push. Он напрямую добавляет значение в этот массив. У функции есть отдельный стек для этих переменных. и он может иметь этот оператор внутри этой функции.
sganesh

Ответы:


152

Нет тестов, но я лично считаю, что $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более эффективно при добавлении нескольких значений. РЕДАКТИРОВАТЬ : Из любопытства провел дополнительное тестирование, и даже для большого количества добавлений отдельные $array[]вызовы выполняются быстрее, чем один большой array_push. Интересный.


Я просто всегда предпочитаю знать, какой из них самый быстрый, поэтому, когда настанет день, меня попросят создать сайт с высокой посещаемостью, и у меня будет некоторое представление. Спасибо за ответ.
Alex

10
Подобные микрооптимизации редко окупаются. Если вы пишете ее с нуля, делайте это так, как имеет наибольший смысл, и только затем, если создание страницы немного медленное, профилируйте ее. Шансы на то, что придется изменить что-то подобное, чтобы ускорить процесс, невелики.
Алистер Булман,

4
Просто чтобы убедиться, поскольку код, похоже, не соответствует $array[]выводам , я подтвердил, что это действительно намного быстрее, 300 мс против 2000 мс для 1M назначений на моей машине. Однако одновременное добавление 20 элементов в array_push заняло примерно 20 $array[] =секунд.
Elle

5
@AlisterBulman Микрооптимизация не стоит усилий, если вы думаете о том, чтобы вернуться через всю свою кодовую базу и «оптимизировать» ее. Однако, если у вас есть несколько разных способов сделать одно и то же и вы знаете, что один способ лучше (даже немного), чем другие, вы можете сделать это своей привычкой. Почему бы тебе этого не сделать?
Okonomiyaki3000

2
@AlisterBulman Я должен категорически не согласиться, или, по крайней мере, частично, если вам виднее, пишите лучше , но не
прилагайте

42

Основное использование array_push () заключается в том, что вы можете поместить несколько значений в конец массива.

Он говорит , что в документации :

Если вы используете array_push () для добавления одного элемента в массив, лучше использовать $ array [] =, потому что в этом случае нет накладных расходов на вызов функции.


29

Из документации php дляarray_push :

Примечание. Если вы используете array_push () для добавления одного элемента в массив, лучше использовать $ array [] =, потому что в этом случае нет накладных расходов на вызов функции.


Забавно, что ваш ответ был первым, но за него проголосовало меньше.
T.Woody

21

Ходят слухи, что [] быстрее, потому что нет накладных расходов на вызов функции. Кроме того, никому не нравятся функции массива PHP ...

"Это ... стог сена, иголка .... или это стог сена иголки ... а, к черту ... [] ="


7
А? Функции массива PHP потрясающие.
cletus

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.