Sự khác biệt giữa array_push () và $ array [] =


117

Trong hướng dẫn sử dụng PHP, ( array_push ) nói ..

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.

Ví dụ :

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

vs

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

Tôi không hiểu tại sao lại có sự khác biệt lớn.


8
Một là lệnh gọi hàm, còn lại thì không. Chính xác những gì được đề cập trong hộp.
KingCrunch

1
Một là lệnh gọi hàm như đã đề cập ở trên có nghĩa là sử dụng một số tài nguyên để chuyển điều khiển sang / từ lệnh gọi hàm (do đó dẫn đến xử lý chi phí). Trong khi, sau đó chỉ đơn giản là gán phần tử mới vào mảng ngay lập tức.
Ghazanfar Mir,

2
câu hỏi này đã giúp tôi tiết kiệm rất nhiều thời gian để đẩy mảng :)
RozzA

Câu trả lời:


151

Khi bạn gọi một hàm trong PHP (chẳng hạn như array_push()), có những chi phí chung cho cuộc gọi, vì PHP phải tra cứu tham chiếu hàm, tìm vị trí của nó trong bộ nhớ và thực thi bất kỳ mã nào nó định nghĩa.

Việc sử dụng $arr[] = 'some value';không yêu cầu lời gọi hàm và thực hiện việc bổ sung thẳng vào cấu trúc dữ liệu. Do đó, khi thêm nhiều dữ liệu, việc sử dụng sẽ nhanh hơn và tiết kiệm tài nguyên hơn rất nhiều $arr[].


3
điều gì sẽ xảy ra nếu ký hiệu như vậy "$ arr [] = 'some value';" bo bo xuống lời gọi của hàm?
Tebe

1
@gekannt Điều đó sẽ xảy ra như thế nào? Ý bạn là nếu 'một số giá trị' trong nhận xét của bạn là một sự đóng cửa? Điều đó sẽ lưu trữ tham chiếu của bao đóng trong mảng. Nếu bạn muốn nói rằng 'một số giá trị' là một hàm được gọi, nó sẽ thêm bất cứ thứ gì mà hàm đó trả về.
Kirkland

Các toán tử @Kirkland chỉ là các hàm có cú pháp thay thế trong hầu hết các ngôn ngữ giống C, tôi không phải là chuyên gia PHP, nhưng tôi có thể tưởng tượng họ đã triển khai các toán tử theo cùng một cách vì đó là phương ngữ C.
Kevin

1
@Kevin: bạn, tôi đồng ý với bạn và tôi khá chắc rằng có một hàm đằng sau cú pháp thay thế của nó không phải là hàm được đề cập ở trên vì tôi thấy nhận xét nguỵ biện trong tài liệu php: "Nếu bạn sử dụng array_push () để thêm một phần tử đối với mảng, tốt hơn nên sử dụng $ array [] = vì theo cách đó, không có chi phí gọi hàm. " không có thời gian bây giờ để xem chính xác những gì đằng sau nó như là thuật ngữ tìm kiếm là chút bối rối cho công cụ tìm kiếm :)
jnhghy - Alexandru Jantea

Có bằng chứng thực tế nào $arr[] = valuenhanh hơn không? Cố gắng tưởng tượng tại sao trình biên dịch lại xử lý mã theo cách khác.
c ..

44

Bạn có thể thêm nhiều hơn 1 phần tử trong một lần chụp vào mảng bằng cách sử dụng array_push,

ví dụ array_push($array_name, $element1, $element2,...)

Trong đó $ element1, $ element2, ... là những phần tử được thêm vào mảng.

Nhưng nếu bạn chỉ muốn thêm một phần tử cùng một lúc, thì phương thức khác (tức là sử dụng $ array_name []) nên được ưu tiên.


Việc kết hợp cả hai khi cần thiết trong một dự án có phải là một thực tiễn không tốt?
PBwebD

1
@ testing123 Hoàn toàn không. Bạn nên sử dụng giải pháp hiệu quả nhất hiện có, trừ khi nó làm suy yếu nghiêm trọng khả năng đọc, khả năng tương thích, v.v. (hoặc nếu bạn cần tuân theo một số hướng dẫn kiểu nhất định).
Chris Kraszewski

15

Sự khác biệt nằm ở dòng bên dưới thành "bởi vì theo cách đó không có chi phí gọi một hàm."

array_push()sẽ đưa ra cảnh báo nếu đối số đầu tiên không phải là một mảng. Điều này khác với $var[]hành vi khi một mảng mới được tạo.


4
Tôi không nói rằng đó là một lý do. Trong câu hỏi, sự khác biệt được yêu cầu và điều này cũng là sự khác biệt
Baig

7

Bạn luôn nên sử dụng $array[]nếu có thể vì hộp này cho biết không có chi phí cho lệnh gọi hàm. Do đó, nó nhanh hơn một chút so với lệnh gọi hàm.


4

array_push - Đẩy một hoặc nhiều phần tử vào cuối mảng

Hãy lưu ý các từ " một hoặc nhiều phần tử ở cuối " để làm điều đó bằng cách sử dụng $arr[]bạn sẽ phải nhận được kích thước tối đa của mảng


Re "để làm điều đó bằng cách sử dụng $ arr [], bạn sẽ phải lấy kích thước tối đa của mảng" . Không, bạn đang bối rối $arr[...index...] = $value;với những gì đang được thảo luận ở đây, đó là $arr[] = $value;. Không cần biết kích thước hoặc mảng, để đẩy vào cuối. Nhiều phần tử sẽ chỉ đơn giản là nhiều cuộc gọi: $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

giải thích: 1. cái đầu tiên khai báo biến trong mảng.

2. phương thức array_push thứ hai được sử dụng để đẩy chuỗi trong biến mảng.

3. cuối cùng nó sẽ in kết quả.

4. phương pháp thứ hai là lưu trữ trực tiếp chuỗi trong mảng.

5. dữ liệu được in trong các giá trị mảng bằng cách sử dụng phương thức print_r.

hai cái này giống nhau


1

cả hai đều giống nhau, nhưng array_push tạo một vòng lặp trong tham số của nó là một mảng và thực hiện $ array [] = $ element


0

Tôi biết đây là một câu trả lời cũ nhưng có thể hữu ích cho những người khác khi biết rằng một sự khác biệt khác giữa hai câu trả lời là nếu bạn phải thêm hơn 2/3 giá trị mỗi vòng lặp vào một mảng thì sẽ nhanh hơn khi sử dụng:

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

thay vì:

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

chỉnh sửa- Quên đóng dấu ngoặc cho forđiều kiện


1
Tôi tự hỏi làm thế nào điều này so sánh với array_merge. Vd for(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }. Tôi suy đoán array_push vẫn nhanh hơn một chút.
ToolmakerSteve

0

Không ai nói, nhưng array_push chỉ đẩy một phần tử đến CUỐI CÙNG CỦA MẶT HÀNG, nơi $ array [index] có thể chèn một giá trị vào bất kỳ chỉ mục nhất định nào. Sự khác biệt lớn.


Câu hỏi là "Sự khác biệt giữa array_push () và $ array [] =" những gì tôi đã nói là một sự khác biệt. Một cái lớn!
Marco

1
Tôi trân trọng không đồng ý. Bạn đang mô tả $array[index] = , đó là một hoạt động khác với $array[] = .... Câu hỏi đưa ra hai đoạn mã và hỏi tại sao lại có sự khác biệt [hiệu suất] đáng kể giữa chúng. Theo nghĩa đen $array[] = ..., câu hỏi là một thành ngữ php cụ thể, không liên quan đến chỉ mục. mảng + chỉ mục giải quyết một vấn đề khác, tạo ra mã khác nhau và là một sự đánh đổi khác nhau.
ToolmakerSteve
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.