Cách tốt nhất để khởi tạo mảng (trống) trong PHP


297

Trong một số ngôn ngữ khác (ví dụ AS3), đã lưu ý rằng việc khởi tạo một mảng mới sẽ nhanh hơn nếu được thực hiện như thế này var foo = []thay var foo = new Array()vì lý do tạo và khởi tạo đối tượng. Tôi tự hỏi liệu có bất kỳ tương đương trong PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
Đó là tất cả những gì tôi từng làm.
Matthew

2
Cảm ơn tất cả mọi người đã trả lời (và rất nhanh!). Tôi đã phải tùy ý chọn một câu trả lời để Andy dường như là người có chiều sâu nhất.
Tom Auger

1
Câu hỏi này giúp ích rất nhiều
Hitesh


2
@ zx1986 đó là một cách khá cồng kềnh để tạo ra một mảng trống. Chắc chắn ít hơn OP $arr = array()hoặc$arr = []
Tom Auger

Câu trả lời:


189

Trong các triển khai ECMAScript (ví dụ: ActionScript hoặc JavaScript), Array()là một hàm tạo và []là một phần của ngữ pháp mảng. Cả hai đều được tối ưu hóa và thực hiện theo những cách hoàn toàn khác nhau, với ngữ pháp theo nghĩa đen không bị vướng mắc bởi chi phí gọi hàm.

Mặt khác, PHP có các cấu trúc ngôn ngữ có thể trông giống như các hàm nhưng không được xử lý như vậy. Ngay cả với PHP 5.4, hỗ trợ []thay thế, không có sự khác biệt về chi phí bởi vì, theo như trình biên dịch / trình phân tích cú pháp, chúng hoàn toàn đồng nghĩa.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Nếu bạn cần hỗ trợ các phiên bản PHP cũ hơn, hãy sử dụng cú pháp cũ. Ngoài ra còn có một đối số cho khả năng đọc nhưng, là một nhà phát triển JS lâu năm, điều này có vẻ khá tự nhiên đối với tôi. Tôi thực sự đã phạm sai lầm khi cố gắng khởi tạo mảng bằng cách sử dụng []khi tôi học PHP lần đầu tiên.

Đây thay đổi về ngôn ngữ ban đầu được đề xuất và từ chối do đa số phiếu chống lại bởi các nhà phát triển cốt lõi với các lý do sau:

Bản vá này sẽ không được chấp nhận vì phần lớn các nhà phát triển cốt lõi đã bỏ phiếu chống lại. Mặc dù nếu bạn có ý nghĩa tích lũy giữa các nhà phát triển cốt lõi và phiếu bầu của người dùng dường như cho thấy điều ngược lại, việc gửi một phù thủy vá lỗi sẽ không được hỗ trợ hoặc duy trì trong thời gian dài.

Tuy nhiên, có vẻ như có một sự thay đổi của trái tim dẫn đến 5,4, có lẽ bị ảnh hưởng bởi việc triển khai hỗ trợ cho các cơ sở dữ liệu phổ biến như MongoDB (sử dụng cú pháp ECMAScript).


51
Có thể thay đổi 5,4 đã được thực hiện vì những người có thể đánh vần "cái đó" đã tiếp quản quá trình bỏ phiếu :)
Rob Grant

40
Tôi thích $array = [];vì nó làm cho việc qua lại giữa JS và PHP dễ dàng hơn.
Justin

Vậy là $array = []; lựa chọn tốt hơn ??? hoặc tôi nên thử cái khác cái nào tốt hơn
Hitesh

2
@hitesh: đó là vấn đề sở thích cá nhân. Cả hai đều giống hệt nhau về mặt chức năng, []chỉ dễ gõ hơn một chút.
Andy E

7
Cú pháp [] dường như được ưa thích trên toàn cầu, nhưng điều quan trọng cần lưu ý là có một số lượng lớn máy chủ vẫn sử dụng riêng 5.3. Nếu bạn muốn phân phối mã của mình, cú pháp [] sẽ gây tử vong.
vv

204
$myArray = []; 

Tạo mảng trống.

Bạn có thể đẩy các giá trị lên mảng sau, như vậy:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

Tại thời điểm này, $ myArray chứa "cây", "nhà" và "chó". Mỗi lệnh trên sẽ nối vào mảng, bảo toàn các mục đã có.

Đến từ các ngôn ngữ khác, cách nối thêm vào một mảng có vẻ lạ đối với tôi. Tôi dự kiến ​​sẽ phải làm một cái gì đó như $ myArray + = "dog" hoặc một cái gì đó ... hoặc có thể là một phương thức "add ()" như các bộ sưu tập Visual Basic có. Nhưng cú pháp nối trực tiếp này chắc chắn là ngắn và thuận tiện.

Bạn thực sự phải sử dụng hàm unset () để xóa các mục:

unset($myArray[1]); 

... sẽ xóa "house" khỏi mảng (các mảng dựa trên zero).

unset($myArray); 

... sẽ phá hủy toàn bộ mảng.

Để rõ ràng, cú pháp dấu ngoặc vuông trống để nối vào một mảng chỉ đơn giản là một cách để PHP tự động gán các chỉ mục cho từng giá trị, thay vì BẠN gán các chỉ mục. Dưới vỏ bọc, PHP thực sự đang làm điều này:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

Bạn có thể tự chỉ định các chỉ mục nếu bạn muốn và bạn có thể sử dụng bất kỳ số nào bạn muốn. Bạn cũng có thể gán số chỉ mục cho một số mục chứ không phải các mục khác. Nếu bạn làm điều đó, PHP sẽ điền vào các số chỉ mục bị thiếu, tăng dần từ số chỉ mục lớn nhất được chỉ định khi nó đi.

Vì vậy, nếu bạn làm điều này:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... mục "con chó" sẽ được cấp số chỉ mục là 21. PHP không thực hiện khớp mẫu thông minh để gán chỉ số tăng dần, vì vậy sẽ không biết rằng bạn có thể muốn nó gán chỉ số từ 30 cho "con chó ". Bạn có thể sử dụng các hàm khác để chỉ định mẫu tăng cho một mảng. Tôi sẽ không đi sâu vào vấn đề đó ở đây, nhưng tất cả đều nằm trong tài liệu PHP.

Chúc mừng

- = Cameron


6
Điều quan trọng cần lưu ý là $ ary = [] chỉ hoạt động trong bài viết 5.4. Tuy nhiên, từ góc độ hiệu suất, không có lợi thế nào cho [] so với mảng ().
Tom Auger

1
Đối với các phiên bản trước, bạn có thể sử dụng mảng_push () w3schools.com/php/func_array_push.asp Tôi không biết liệu có một cú đánh hiệu suất nào liên quan đến việc này không.
Đánh dấu

3
Bạn đã hiểu nhầm @ TomAuger điểm @Mark. $array[] = 'foo'chỉ hoạt động tốt trong các phiên bản cũ hơn của PHP. Chỉ $array = [];khởi tạo một mảng mới trong 5.4.
Codemonkey

Công bằng mà nói, điều này thực sự trả lời câu hỏi của OP.
Smitty

lol ... Tâm trí bị thổi bay. Hàng thập kỷ của PHP và tôi chỉ đang học bạn không cần Array_push.
Bangkok

61

Trước PHP 5.4:

$myArray = array();

PHP 5.4 trở lên

$myArray = [];

Và làm thế nào chúng ta có thể tạo mảng đa chiều bằng PHP 5.4 trở lên?
Siraj Alam

26

Trong PHP một mảng là một mảng; không có sự xem xét nguyên thủy so với đối tượng, vì vậy không có sự tối ưu hóa nào có thể so sánh được.


1
Câu trả lời hay nhất IMO: có nhiều cú pháp khác nhau, nhưng về màn trình diễn thì tất cả đều giống nhau.
Matthieu Napoli

1
Có vấn đề về hiệu suất liên quan đến cả hai không .. tôi có thể kiểm tra vấn đề này ở đâu .. bất kỳ liên kết hoặc tài liệu nào
Hitesh

2
Kết quả là, cho đến khi bạn chắc chắn rằng mã của mình sẽ không bao giờ được chạy trên các môi trường trước 5.4, hãy sử dụng $ Array = new mảng ()
Tom Auger

20

Những gì bạn đang làm là chính xác 100%.

Về mặt đặt tên đẹp, người ta thường thực hiện rằng các thuộc tính riêng tư / được bảo vệ có trước một dấu gạch dưới để làm rõ rằng chúng không công khai. Ví dụ private $_arr = array()haypublic $arr = array()


2
Trong php, tôi nghĩ tốt hơn là không đặt tên cho chúng bằng dấu gạch dưới vì bạn luôn sử dụng $thisđể nhận giá trị và không bao giờ nên sử dụng các thuộc tính công cộng.
meze

1
@meze bạn truy cập chúng như thế nào $this->arr$this->_arr. Tại sao bạn không bao giờ nên sử dụng tài sản công cộng?!
James C

5

Thử cái này:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }

4
Thật tuyệt, nhưng giống như một trò lừa bịp hơn là một mẫu mã hóa thực sự hữu ích, bạn có nghĩ vậy không?
Tom Auger

Có thể hữu ích nếu bạn muốn tạo mảng của mình trong một đối tượng với mẫu thuộc tính và chuyển đổi nó thành mảng cuối cùng.
Jomar Sevillejo 8/12/2015

4

Không có cách nào khác , vì vậy đây là tốt nhất.

Chỉnh sửa: Câu trả lời này không hợp lệ vì PHP 5.4 trở lên.


Đây không còn là trường hợp nữa, 5.4 đã giới thiệu cú pháp tốc ký cho mảng.
Andy E

13
@Mote Tại sao rất ghét: '(? Đùa sang một bên, tôi đã làm cho nó rõ ràng hơn bằng cách "đánh" câu trả lời cũ. Nó vẫn có thể hữu ích cho một người mới để hiểu rằng câu trả lời đã thay đổi.
Matthieu Napoli

@Motes Mọi người mất lợi ích đại diện từ câu trả lời khi họ xóa nó. Tốt hơn hết là chỉnh sửa nó.
mbomb007

4

Khởi tạo một mảng đơn giản:

<?php $array1=array(10,20,30,40,50); ?>

Đang khởi tạo mảng trong mảng:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Nguồn: Sorce cho mã


3
Câu hỏi ban đầu là về cách khởi tạo một mảng trống .
Tom Auger
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.