Điều gì tốt hơn khi sử dụng trong PHP, $ array [] = $ value hoặc array_push ($ array, $ value)?


113

Có gì tốt hơn khi sử dụng trong PHP để thêm một thành viên mảng,

$array[] = $value;

hoặc là

array_push($array, $value);

?

Mặc dù hướng dẫn sử dụng nói rằng bạn nên tránh một cuộc gọi hàm, tôi cũng đọc $array[]chậm hơn nhiều array_push(). Một số làm rõ hoặc điểm chuẩn là gì?


2
$ myArray [] = 123; Điều này sẽ nhanh hơn so với hàm array_push. Nó trực tiếp thêm giá trị vào mảng đó. Hàm có ngăn xếp riêng biệt cho các biến đó. và nó có thể có câu lệnh đó bên trong hàm đó,.
sganesh

Câu trả lời:


150

Không có điểm chuẩn nào, nhưng cá nhân tôi cảm thấy nó trông $array[]sạch sẽ hơn và thành thật mà nói, việc chia nhỏ các sợi tóc trong mili giây là khá không liên quan trừ khi bạn có kế hoạch thêm hàng trăm nghìn chuỗi vào mảng của mình.

Chỉnh sửa : Chạy mã này:

$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;

Phương pháp đầu tiên sử dụng $array[]nhanh hơn gần 50% so với phương pháp thứ hai.

Một số kết quả điểm chuẩn:

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[]

Điều này không có gì đáng ngạc nhiên, vì hướng dẫn sử dụng PHP lưu ý điều này:

Nếu bạn sử dụng array_push () để thêm một phần tử vào mảng thì tốt hơn nên sử dụng $ array [] = vì theo cách đó, không có chi phí gọi hàm.

Cách nó được diễn đạt Tôi sẽ không ngạc nhiên nếu array_pushhiệu quả hơn khi thêm nhiều giá trị. CHỈNH SỬA : Vì tò mò, đã thực hiện một số thử nghiệm thêm và thậm chí đối với một số lượng lớn bổ sung, các $array[]cuộc gọi riêng lẻ nhanh hơn một cuộc gọi lớn array_push. Hấp dẫn.


Tôi chỉ luôn muốn biết cách nào là nhanh nhất vì vậy khi đến ngày tôi sẽ được yêu cầu tạo ra một trang web có lưu lượng truy cập cao, tôi sẽ có một số thông tin chi tiết. Cảm ơn vì câu trả lời.
alex

10
Những tối ưu hóa vi mô như thế này hiếm khi đáng để nỗ lực. Nếu bạn đang viết nó từ đầu, hãy làm điều đó sao cho hợp lý nhất, và chỉ sau đó, nếu việc tạo trang hơi chậm, hãy lập hồ sơ cho nó. Khả năng phải thay đổi thứ gì đó như thế này để đẩy nhanh tiến độ là rất nhỏ.
Alister Bulman

4
Chỉ để đảm bảo rằng, vì mã có vẻ không khớp với đầu ra, tôi đã xác minh rằng $array[]nó thực sự nhanh hơn nhiều, 300ms so với 2000ms cho 1M bài tập trên máy của tôi. Tuy nhiên, việc thêm 20 mục cùng một lúc trong array_push nhanh khoảng 20 $array[] =giây.
Elle

5
@AlisterBulman Tối ưu hóa vi mô không đáng để nỗ lực nếu bạn đang nghĩ đến việc quay lại toàn bộ cơ sở mã của mình và 'tối ưu hóa' nó. Tuy nhiên, nếu bạn có nhiều cách khác nhau để thực hiện cùng một việc và nhận thức được rằng một cách tốt hơn (thậm chí chỉ một chút) so với những cách khác, bạn có thể biến nó thành thói quen sử dụng cách đó. Tại sao bạn không làm điều này?
Okonomiyaki3000

2
@AlisterBulman tôi phải đồng ý mạnh mẽ, hoặc ít nhất là một phần, nếu bạn biết rõ hơn, ghi tốt hơn , nhưng không đặt nhiều nỗ lực để tìm kiếm khả năng vi-tối ưu hóa ...
jave.web

42

Công dụng chính của array_push () là bạn có thể đẩy nhiều giá trị vào cuối mảng.

Nó nói trong tài liệu :

Nếu bạn sử dụng array_push () để thêm một phần tử vào mảng thì tốt hơn nên sử dụng $ array [] = vì theo cách đó, không có chi phí gọi hàm.


29

Từ tài liệu php choarray_push :

Lưu ý: Nếu bạn sử dụng array_push () để thêm một phần tử vào mảng thì tốt hơn nên sử dụng $ array [] = vì theo cách đó, không có chi phí gọi hàm.


Thật buồn cười khi câu trả lời của bạn đầu tiên, nhưng ít được bình chọn hơn.
T.Woody

21

Từ trên đường phố là [] nhanh hơn vì không có chi phí cho lệnh gọi hàm. Thêm vào đó, không ai thực sự thích các hàm mảng của PHP ...

"Nó ... đống cỏ khô, cái kim .... hay nó là cái đống cỏ khô ... à, f *** nó ... [] ="


7
Huh? Các hàm mảng của PHP thật tuyệt vời.
cletus

13
Về mặt chức năng, chúng thật tuyệt vời, vâng, nhưng anh ấy đang đề cập đến cách đặt tên không nhất quán.
ryeguy 18/02/09

2
Bạn nên bật gợi ý tham số trong IDE của mình. Nhưng tôi đồng ý, một số nhất quán sẽ rất tốt.
Pim Jager

4
Tôi đồng ý về điều này. Không có sự nhất quán nào cả trong lược đồ đặt tên (x_y hoặc xy hoặc y_x ...) cũng như logic tham số (chuyển đối tượng đích đầu tiên, cuối cùng, giữa các mảng, chuỗi và regexps, chúc bạn may mắn tìm được quy tắc chung!).
e2-e4,

3
FWIW, tôi giống như kim / Haystack quy ước đặt tên và tìm thấy nó dễ nhớ, vì nó đi theo thứ tự giống như cụm từ: "giống như việc tìm kiếm một cây kim (1) trong một đống cỏ khô (2)"
rybo111

8

Một điểm khác biệt là bạn có thể gọi array_push () với nhiều hơn hai tham số, tức là bạn có thể đẩy nhiều hơn một phần tử cùng một lúc vào một mảng.

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

bản in 1,2,3,4


2

Một khai báo $ myarray [] đơn giản sẽ nhanh hơn vì bạn chỉ cần đẩy một mục lên chồng các mục do thiếu chi phí mà một hàm sẽ mang lại.


2

Vì " array_push " là một hàm và nó được gọi nhiều lần khi nó ở bên trong vòng lặp nên nó sẽ cấp phát một bộ nhớ vào ngăn xếp. Nhưng khi chúng ta đang sử dụng $ array [] = $ value thì chúng ta chỉ gán giá trị cho mảng.


1

Thứ hai là một lệnh gọi hàm nên nói chung nó sẽ chậm hơn so với việc sử dụng các tính năng truy cập mảng cốt lõi. Nhưng tôi nghĩ rằng ngay cả một truy vấn cơ sở dữ liệu trong tập lệnh của bạn cũng sẽ nặng hơn 1.000.000 cuộc gọi đến array_push().


0

Mặc dù câu hỏi chủ yếu là về hiệu suất, nhưng mọi người sẽ đến câu hỏi này tự hỏi liệu nó có thực hành tốt để sử dụng array_pushhay không $arr[].

Hàm có thể có nghĩa là ít dòng hơn cho nhiều giá trị:

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

Tuy nhiên , array_push...

  • không thể nhận các phím mảng
  • phá vỡ quy ước đặt tên kim / đống cỏ khô
  • chậm hơn, như đã được thảo luận

Tôi sẽ gắn bó với $arr[].


0

Tôi chỉ không thể thêm: int array_push(...)trả về số phần tử mới trong mảng ( php doc ). mà có thể hữu ích và nhỏ gọn hơn $myArray[] = ...; $total = count($myArray);.

Cũng array_push(...)có ý nghĩa khi biến được sử dụng làm ngăn xếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.