Một số câu trả lời hợp lý, nhưng chỉ nghĩ rằng tôi sẽ mở rộng một chút để giải thích rõ ràng hơn khi PHP xác định nếu một mảng trống.
Ghi chú chính:
Một mảng có khóa (hoặc khóa) sẽ được PHP xác định là KHÔNG rỗng .
Vì các giá trị mảng cần các khóa để tồn tại, có các giá trị hay không trong một mảng không xác định nếu nó trống, chỉ khi không có khóa (do đó không có giá trị).
Vì vậy, việc kiểm tra một mảng empty()
không chỉ đơn giản là cho bạn biết bạn có giá trị hay không, nó sẽ cho bạn biết nếu mảng đó trống và các khóa là một phần của mảng.
Vì vậy, hãy xem xét cách bạn đang sản xuất mảng của mình trước khi quyết định sử dụng phương pháp kiểm tra nào.
EG Một mảng sẽ có các khóa khi người dùng gửi biểu mẫu HTML của bạn khi mỗi trường biểu mẫu có một tên mảng (nghĩa là name="array[]"
).
Một mảng không trống sẽ được tạo cho từng trường vì sẽ có các giá trị khóa tăng tự động cho từng mảng của trường mẫu.
Lấy các mảng này làm ví dụ:
/* Assigning some arrays */
// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");
// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";
// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';
Nếu bạn lặp lại các khóa và giá trị mảng cho các mảng trên, bạn sẽ nhận được các thông tin sau:
ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]
ARRAY HAI:
[0] => [UserValue01]
[1] => [UserValue02]
ARRAY BA:
[0] => []
[1] => []
Và thử nghiệm các mảng trên với empty()
trả về các kết quả sau:
ARRAY ONE:
$ ArrayOne không trống
ARRAY HAI:
$ ArrayTwo không trống
ARRAY BA:
$ ArrayThree không trống
Một mảng sẽ luôn trống khi bạn gán một mảng nhưng không sử dụng nó sau đó, chẳng hạn như:
$ArrayFour = array();
Điều này sẽ trống, tức là PHP sẽ trả về ĐÚNG khi sử dụng nếu empty()
ở trên.
Vì vậy, nếu mảng của bạn có các khóa - ví dụ như tên đầu vào của biểu mẫu hoặc nếu bạn gán chúng theo cách thủ công (nghĩa là tạo một mảng có tên cột cơ sở dữ liệu làm khóa nhưng không có giá trị / dữ liệu từ cơ sở dữ liệu), thì mảng sẽ KHÔNG empty()
.
Trong trường hợp này, bạn có thể lặp mảng trong một foreach, kiểm tra nếu mỗi khóa có một giá trị. Đây là một phương pháp tốt nếu bạn vẫn cần chạy qua mảng, có thể kiểm tra các khóa hoặc vệ sinh dữ liệu.
Tuy nhiên, đây không phải là phương pháp tốt nhất nếu bạn chỉ cần biết "nếu giá trị tồn tại" trả về TRUE hoặc FALSE . Có nhiều phương pháp khác nhau để xác định xem một mảng có bất kỳ giá trị nào không khi biết nó sẽ có khóa. Một hàm hoặc lớp có thể là cách tiếp cận tốt nhất, nhưng như mọi khi nó phụ thuộc vào môi trường và các yêu cầu chính xác của bạn, cũng như những thứ khác như những gì bạn hiện đang làm với mảng (nếu có).
Đây là một cách tiếp cận sử dụng rất ít mã để kiểm tra xem một mảng có các giá trị hay không:
Sử dụng array_filter()
:
Lặp lại từng giá trị trong mảng chuyển chúng đến hàm gọi lại. Nếu hàm gọi lại trả về true, giá trị hiện tại từ mảng được trả về mảng kết quả. Các khóa mảng được bảo tồn.
$EmptyTestArray = array_filter($ArrayOne);
if (!empty($EmptyTestArray))
{
// do some tests on the values in $ArrayOne
}
else
{
// Likely not to need an else,
// but could return message to user "you entered nothing" etc etc
}
Chạy array_filter()
trên cả ba mảng mẫu (được tạo trong khối mã đầu tiên trong câu trả lời này) dẫn đến kết quả như sau:
ARRAY ONE:
$ Arrayone không trống
ARRAY TWO:
$ Arraytwo không trống
ARRAY BA:
$ Arraythree trống
Vì vậy, khi không có giá trị, có khóa hay không, sử dụng array_filter()
để tạo mảng mới và sau đó kiểm tra xem mảng mới có trống không nếu có bất kỳ giá trị nào trong mảng ban đầu.
Nó không lý tưởng và hơi lộn xộn, nhưng nếu bạn có một mảng lớn và không cần phải lặp lại vì bất kỳ lý do nào khác, thì đây là cách đơn giản nhất về mặt mã cần thiết.
Tôi không có kinh nghiệm trong việc kiểm tra các chi phí, nhưng sẽ rất tốt nếu biết sự khác biệt giữa việc sử dụng array_filter()
vàforeach
kiểm tra nếu tìm thấy giá trị.
Rõ ràng điểm chuẩn sẽ cần phải có trên các tham số khác nhau, trên các mảng nhỏ và lớn và khi có giá trị và không, v.v.