Làm thế nào để kiểm tra xem một mảng có trống bằng PHP không?


471

playerssẽ trống hoặc danh sách được phân tách bằng dấu phẩy (hoặc một giá trị duy nhất). Cách dễ nhất để kiểm tra nếu nó trống? Tôi giả sử tôi có thể làm như vậy ngay khi tôi lấy $gameresultmảng vào $gamerow? Trong trường hợp này, có lẽ sẽ hiệu quả hơn nếu bỏ qua việc phát nổ $playerlistnếu nó trống, nhưng để tranh luận, tôi sẽ kiểm tra xem một mảng có trống không?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);

2
Không sử dụng Count (), sizeof (), blank (). Mảng trống trả về false: if ($ mảng) {
Limitrof

Câu trả lời:


774

Nếu bạn chỉ cần kiểm tra xem có bất kỳ yếu tố nào trong mảng không

if (empty($playerlist)) {
     // list is empty.
}

Nếu bạn cần xóa sạch các giá trị trống trước khi kiểm tra (thường được thực hiện để ngăn chặn các explodechuỗi lạ):

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}

2
Bạn có nên sử dụng sản phẩm nào không? đếm sẽ mất nhiều thời gian hơn để thực hiện cho các mảng lớn.
Dan McGrath

1
Làm xong. Tôi cũng đã thay đổi nó vì thực tế là bạn không phải sử dụng ngay lập tức.
Tyler Carter

5
Lấy ví dụ mã của anh ấy, biến sẽ được đặt để bạn không cần sử dụng empty().
Cobby

4
CẨN THẬN! if(!isset($emptyarray))falsenhưng if(empty($emptyarray))trả lại true. Điều đó vừa đóng đinh tôi
Kolob Canyon

161

Một mảng trống là falsey trong PHP, vì vậy bạn thậm chí không cần sử dụng empty()như những người khác đã đề xuất.

<?php
$playerList = array();
if (!$playerList) {
    echo "No players";
} else {
    echo "Explode stuff...";
}
// Output is: No players

PHP empty()sẽ xác định xem một biến không tồn tại hoặc có giá trị falsey (như array(), 0, null, false, vv).

Trong hầu hết các trường hợp bạn chỉ muốn kiểm tra !$emptyVar. Sử dụng empty($emptyVar)nếu biến có thể chưa được đặt VÀ bạn không muốn kích hoạt E_NOTICE; IMO đây thường là một ý tưởng tồi.


2
Tôi hy vọng điều này sẽ không thay đổi trong một số tiêu chuẩn ... nó sẽ đau đớn
David Constantine

79

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()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.


2
Cảm ơn rất nhiều vì điều này. Nó thực sự có nhiều thông tin và có thể giải quyết vấn đề của tôi bằng cách sử dụngarray_filter()
Brian Powell

trống (mảng ()) sẽ luôn luôn đánh giá là FALSE, vì vậy việc thêm số đếm (mảng ()) == 0 sẽ tạo ra sự thật
timmz

1
@mboullouz count(array())==0là sai khi có khóa và không có giá trị, vì vậy điều này không giúp ích gì trong việc kiểm tra giá trị. Tuyên bố của bạn là chính xác, nhưng bạn đang buộc một bài kiểm tra count(array())vì mảng tất nhiên là trống. Chúng ta cần kiểm tra khi mảng trở lại từ một biểu mẫu hoặc ở nơi khác để biết nó có trống không (khóa / giá trị) hay chỉ có giá trị hay không
James

Giải pháp này là hoàn hảo cho loại mảng này, ví dụ, nó giúp ích khi bạn muốn xác thực một tệp đầu vào array_filter($_FILES["documento"]['name'])
Gendrith 17/03/19


12

Nếu bạn muốn xác định xem biến bạn đang kiểm tra có thực sự là một mảng trống hay không, bạn có thể sử dụng một cái gì đó như thế này:

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}

11

Nếu bạn muốn loại trừ các hàng sai hoặc trống (chẳng hạn như 0 => ''), việc sử dụng empty()sẽ thất bại, bạn có thể thử:

if (array_filter($playerlist) == []) {
  // Array is empty!
}

array_filter(): Nếu không có cuộc gọi lại nào được cung cấp, tất cả các mục của mảng bằng FALSE (xem chuyển đổi sang boolean) sẽ bị xóa.

Nếu bạn muốn xóa tất cả NULL, FALSE và chuỗi rỗng ( ''), nhưng để lại giá trị 0 ( 0), bạn có thể sử dụng strlenlàm cuộc gọi lại, ví dụ:

$is_empty = array_filter($playerlist, 'strlen') == [];

Đây là câu trả lời đúng cho một câu hỏi khác. Sử dụng bộ lọc mảng sẽ phá hủy các phần tử hiện có với giá trị falsey. Đây không phải là những gì OP đang yêu cầu.
mickmackusa

8

Tại sao không ai nói câu trả lời này:

$array = [];

if($array == []) {
    // array is empty
}

1
Tuyên bố của bạn là không chính xác. Ai đó DID nói câu trả lời này - Tim Ogilvy - một năm trước. Sử dụng niềng răng vuông thay vì array()là điều tương tự.
mickmackusa

Trong khi dưới mui xe, đó là cùng một câu trả lời ... về mặt kỹ thuật. Tôi đã sử dụng dấu ngoặc vuông thay cho hàm mảng lỗi thời.
Cướp

7
is_array($detect) && empty($detect);

is_array


Đây là những kiểm tra không cần thiết. OP đang gọi explode()- nó trả về dữ liệu kiểu mảng. Kiểm tra empty()là một cuộc gọi chức năng không cần thiết. Như Cobby đã nêu trong năm 2012, if($detect)là tất cả những gì cần thiết. Giải pháp này không nên được thực hiện cho nhiệm vụ này hoặc các nhiệm vụ khác. Bạn có thể lập luận rằng bạn đang bao quát các tình huống nằm ngoài phạm vi của câu hỏi này, tốt, không bao giờ cần phải gọi empty()SAU is_array()vì nếu biến không được "đặt", thì is_array()sẽ tạo ra "Thông báo: Biến không xác định", nếu isset()sau đó empty()quá mức, chỉ cần sử dụng Câu trả lời của Cobby.
mickmackusa

6

Tôi chạy điểm chuẩn bao gồm ở cuối bài. Để so sánh các phương pháp:

  • count($arr) == 0 : đếm
  • empty($arr) : trống
  • $arr == [] : comp
  • (bool) $arr : diễn viên

và nhận được kết quả như sau

Contents  \method |    count     |    empty     |     comp     |     cast     |
------------------|--------------|--------------|--------------|--------------|
            Empty |/* 1.213138 */|/* 1.070011 */|/* 1.628529 */|   1.051795   |
          Uniform |/* 1.206680 */|   1.047339   |/* 1.498836 */|/* 1.052737 */|
          Integer |/* 1.209668 */|/* 1.079858 */|/* 1.486134 */|   1.051138   |
           String |/* 1.242137 */|   1.049148   |/* 1.630259 */|/* 1.056610 */|
            Mixed |/* 1.229072 */|/* 1.068569 */|/* 1.473339 */|   1.064111   |
      Associative |/* 1.206311 */|   1.053642   |/* 1.480637 */|/* 1.137740 */|
------------------|--------------|--------------|--------------|--------------|
            Total |/* 7.307005 */|   6.368568   |/* 9.197733 */|/* 6.414131 */|

Sự khác biệt giữa trống và đúc thành boolean là không đáng kể. Tôi đã chạy thử nghiệm này nhiều lần và chúng có vẻ tương đương nhau. Nội dung của các mảng dường như không đóng một vai trò quan trọng. Cả hai đều cho kết quả ngược lại nhưng sự phủ định logic chỉ đủ để đẩy việc đúc thành chiến thắng trong hầu hết thời gian nên cá nhân tôi thích trống rỗng vì lợi ích của tính dễ đọc trong cả hai trường hợp.

#!/usr/bin/php
<?php

//    012345678
$nt = 90000000;

$arr0 = [];
$arr1 = [];
$arr2 = [];
$arr3 = [];
$arr4 = [];
$arr5 = [];

for ($i = 0; $i < 500000; $i++) {
    $arr1[] = 0;
    $arr2[] = $i;
    $arr3[] = md5($i);
    $arr4[] = $i % 2 ? $i : md5($i);
    $arr5[md5($i)] = $i;
}

$t00 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr0) == 0;
}
$t01 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr0);
}
$t02 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr0 == [];
}
$t03 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr0;
}
$t04 = microtime(true);

$t10 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr1) == 0;
}
$t11 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr1);
}
$t12 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr1 == [];
}
$t13 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr1;
}
$t14 = microtime(true);

/* ------------------------------ */

$t20 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr2) == 0;
}
$t21 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr2);
}
$t22 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr2 == [];
}
$t23 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr2;
}
$t24 = microtime(true);

/* ------------------------------ */

$t30 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr3) == 0;
}
$t31 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr3);
}
$t32 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr3 == [];
}
$t33 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr3;
}
$t34 = microtime(true);

/* ------------------------------ */

$t40 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr4) == 0;
}
$t41 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr4);
}
$t42 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr4 == [];
}
$t43 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr4;
}
$t44 = microtime(true);

/* ----------------------------------- */

$t50 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr5) == 0;
}
$t51 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr5);
}
$t52 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr5 == [];
}
$t53 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr5;
}
$t54 = microtime(true);

/* ----------------------------------- */

$t60 = $t00 + $t10 + $t20 + $t30 + $t40 + $t50;
$t61 = $t01 + $t11 + $t21 + $t31 + $t41 + $t51;
$t62 = $t02 + $t12 + $t22 + $t32 + $t42 + $t52;
$t63 = $t03 + $t13 + $t23 + $t33 + $t43 + $t53;
$t64 = $t04 + $t14 + $t24 + $t34 + $t44 + $t54;

/* ----------------------------------- */

$ts0[1] = number_format(round($t01 - $t00, 6), 6);
$ts0[2] = number_format(round($t02 - $t01, 6), 6);
$ts0[3] = number_format(round($t03 - $t02, 6), 6);
$ts0[4] = number_format(round($t04 - $t03, 6), 6);

$min_idx = array_keys($ts0, min($ts0))[0];
foreach ($ts0 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts0[$idx] = "   $val   ";
    } else {
        $ts0[$idx] = "/* $val */";
    }

}

$ts1[1] = number_format(round($t11 - $t10, 6), 6);
$ts1[2] = number_format(round($t12 - $t11, 6), 6);
$ts1[3] = number_format(round($t13 - $t12, 6), 6);
$ts1[4] = number_format(round($t14 - $t13, 6), 6);

$min_idx = array_keys($ts1, min($ts1))[0];
foreach ($ts1 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts1[$idx] = "   $val   ";
    } else {
        $ts1[$idx] = "/* $val */";
    }

}

$ts2[1] = number_format(round($t21 - $t20, 6), 6);
$ts2[2] = number_format(round($t22 - $t21, 6), 6);
$ts2[3] = number_format(round($t23 - $t22, 6), 6);
$ts2[4] = number_format(round($t24 - $t23, 6), 6);

$min_idx = array_keys($ts2, min($ts2))[0];
foreach ($ts2 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts2[$idx] = "   $val   ";
    } else {
        $ts2[$idx] = "/* $val */";
    }

}

$ts3[1] = number_format(round($t31 - $t30, 6), 6);
$ts3[2] = number_format(round($t32 - $t31, 6), 6);
$ts3[3] = number_format(round($t33 - $t32, 6), 6);
$ts3[4] = number_format(round($t34 - $t33, 6), 6);

$min_idx = array_keys($ts3, min($ts3))[0];
foreach ($ts3 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts3[$idx] = "   $val   ";
    } else {
        $ts3[$idx] = "/* $val */";
    }

}

$ts4[1] = number_format(round($t41 - $t40, 6), 6);
$ts4[2] = number_format(round($t42 - $t41, 6), 6);
$ts4[3] = number_format(round($t43 - $t42, 6), 6);
$ts4[4] = number_format(round($t44 - $t43, 6), 6);

$min_idx = array_keys($ts4, min($ts4))[0];
foreach ($ts4 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts4[$idx] = "   $val   ";
    } else {
        $ts4[$idx] = "/* $val */";
    }

}

$ts5[1] = number_format(round($t51 - $t50, 6), 6);
$ts5[2] = number_format(round($t52 - $t51, 6), 6);
$ts5[3] = number_format(round($t53 - $t52, 6), 6);
$ts5[4] = number_format(round($t54 - $t53, 6), 6);

$min_idx = array_keys($ts5, min($ts5))[0];
foreach ($ts5 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts5[$idx] = "   $val   ";
    } else {
        $ts5[$idx] = "/* $val */";
    }

}

$ts6[1] = number_format(round($t61 - $t60, 6), 6);
$ts6[2] = number_format(round($t62 - $t61, 6), 6);
$ts6[3] = number_format(round($t63 - $t62, 6), 6);
$ts6[4] = number_format(round($t64 - $t63, 6), 6);

$min_idx = array_keys($ts6, min($ts6))[0];
foreach ($ts6 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts6[$idx] = "   $val   ";
    } else {
        $ts6[$idx] = "/* $val */";
    }

}

echo "             |    count     |    empty     |     comp     |     cast     |\n";
echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Empty |";
echo $ts0[1] . '|';
echo $ts0[2] . '|';
echo $ts0[3] . '|';
echo $ts0[4] . "|\n";

echo "     Uniform |";
echo $ts1[1] . '|';
echo $ts1[2] . '|';
echo $ts1[3] . '|';
echo $ts1[4] . "|\n";

echo "     Integer |";
echo $ts2[1] . '|';
echo $ts2[2] . '|';
echo $ts2[3] . '|';
echo $ts2[4] . "|\n";

echo "      String |";
echo $ts3[1] . '|';
echo $ts3[2] . '|';
echo $ts3[3] . '|';
echo $ts3[4] . "|\n";

echo "       Mixed |";
echo $ts4[1] . '|';
echo $ts4[2] . '|';
echo $ts4[3] . '|';
echo $ts4[4] . "|\n";

echo " Associative |";
echo $ts5[1] . '|';
echo $ts5[2] . '|';
echo $ts5[3] . '|';
echo $ts5[4] . "|\n";

echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Total |";
echo $ts6[1] . '|';
echo $ts6[2] . '|';
echo $ts6[3] . '|';
echo $ts6[4] . "|\n";

Điểm chuẩn tốt, nhưng bạn đã quên sizeofđó là [không?] Bí danh của empty... stackoverflow.com/a/51986794/1429432
Yousha Aleayoub

FYI: Khi tôi chạy điểm chuẩn này bằng PHP 7.4, tôi đã nhận được các kết quả khác nhau cho thấy so sánh là nhanh nhất.
Nick Merrill

5

nếu bạn muốn kiểm tra nội dung mảng bạn có thể sử dụng:

$arr = array();

if(!empty($arr)){
  echo "not empty";
}
else 
{
  echo "empty";
}

xem tại đây: http://codepad.org/EORE4k7v


Như Cobby đã chỉ ra vào năm 2012, không cần thiết phải gọi một hàm để kiểm tra xem một mảng khai báo có trống hay không.
mickmackusa

5

Theo tôi cách đơn giản nhất cho một mảng được lập chỉ mục sẽ đơn giản là:

    if ($array) {
      //Array is not empty...  
    }

Một điều kiện 'nếu' trên mảng sẽ đánh giá là đúng nếu mảng không trốngsai nếu mảng trống . Điều này không áp dụng cho các mảng kết hợp.


Cobby đã tuyên bố hiệu quả kỹ thuật này vào năm 2012. Câu trả lời của ông hiện có 133 upvote.
mickmackusa

Đây không phải là "đơn giản" như một vấn đề về quan điểm - nó đơn giản nhất vì không có cú pháp nào có thể ngắn gọn hơn và điều này không có chi phí gọi hàm. TUYỆT ĐỐI KHÔNG CÓ SỰ KHÁC BIỆT khi truy cập vào một mảng với các khóa được lập chỉ mục so với các khóa kết hợp. Câu trả lời này là các nhà nghiên cứu sai lệch. Câu trả lời này là không cần thiết , sau đó incorect . 3v4l.org/DSLha
mickmackusa

3

Tôi sử dụng mã này

$variable = array();

if( count( $variable ) == 0 )
{
    echo "Array is Empty";
}
else
{
    echo "Array is not Empty";
}

Nhưng lưu ý rằng nếu mảng có số lượng khóa lớn, mã này sẽ dành nhiều thời gian để đếm chúng, so với các câu trả lời khác ở đây.


Như Cobby đã chỉ ra vào năm 2012, không cần thiết phải gọi một hàm để kiểm tra xem một mảng khai báo có trống hay không.
mickmackusa

3

Bạn có thể sử dụng array_filter()mà hoạt động tuyệt vời cho tất cả các tình huống:

$ray_state = array_filter($myarray);

if (empty($ray_state)) {
    echo 'array is empty';
} else {
    echo 'array is not empty';
}

1
Câu trả lời này là sử dụng kiểm tra không cần thiết. Trước hết, OP không quan tâm đến việc lọc bất kỳ giá trị falsey nào khỏi mảng trước khi kiểm tra sự trống rỗng của nó - vì vậy bạn đã đi chệch khỏi câu hỏi được đăng. Thứ hai, như Cobby thể hiện vào năm 2012, không cần thiết phải gọi một hàm để kiểm tra xem một mảng được khai báo có trống hay không.
mickmackusa

2
 $gamerow = mysql_fetch_array($gameresult);

if (!empty(($gamerow['players'])) {
   $playerlist = explode(",", $gamerow['players']);
}else{

  // do stuf if array is empty
}

2

Tôi nghĩ cách tốt nhất để xác định xem mảng có trống hay không là sử dụng Count () như vậy:

if(count($array)) {
    return 'anything true goes here';
}else {
    return 'anything false'; 
}

Cuộc count()gọi có thể được loại bỏ hoàn toàn - xem câu trả lời của Cobby.
mickmackusa

2

Đưa ra quyết định phù hợp nhất đòi hỏi phải biết chất lượng dữ liệu của bạn và các quy trình phải tuân theo.

  1. Nếu bạn định loại bỏ / bỏ qua / loại bỏ hàng này, thì điểm lọc sớm nhất sẽ nằm trong truy vấn mysql.

    • WHERE players IS NOT NULL
    • WHERE players != ''
    • WHERE COALESCE(players, '') != ''
    • WHERE players IS NOT NULL AND players != ''
    • ... nó phụ thuộc vào dữ liệu cửa hàng của bạn và sẽ có những cách khác, tôi sẽ dừng ở đây.
  2. Nếu bạn không chắc chắn 100% nếu cột tồn tại trong tập kết quả, thì bạn nên kiểm tra xem cột có được khai báo hay không. Điều này sẽ có nghĩa là kêu gọi array_key_exists(), isset()hoặc empty()trên cột. Tôi sẽ không bận tâm đến việc phân định sự khác biệt ở đây (có những trang SO khác cho sự cố đó, đây là một sự khởi đầu: 1 , 2 , 3 ). Điều đó nói rằng, nếu bạn không kiểm soát hoàn toàn tập kết quả, thì có lẽ bạn đã sử dụng quá mức "tính linh hoạt" của ứng dụng và nên suy nghĩ lại nếu sự cố truy cập dữ liệu cột không tồn tại có đáng không. Thực tế, tôi đang nói rằng bạn không bao giờ cần phải kiểm tra nếu một cột được khai báo - ergo bạn không bao giờ cầnempty() cho nhiệm vụ này. Nếu ai đó đang tranh luận rằngempty()là phù hợp hơn, sau đó họ đang thúc đẩy ý kiến ​​cá nhân của họ về tính biểu cảm của kịch bản. Nếu bạn thấy điều kiện trong số 5 dưới đây là mơ hồ, hãy thêm một nhận xét nội tuyến vào mã của bạn - nhưng tôi sẽ không làm thế. Điểm mấu chốt là không có lợi thế về mặt lập trình để thực hiện chức năng gọi.

  3. Giá trị chuỗi của bạn có thể chứa một 0 mà bạn muốn cho là đúng / hợp lệ / không trống không? Nếu vậy, thì bạn chỉ cần kiểm tra xem giá trị cột có dài không.

    Đây là một bản demo sử dụng strlen(). Điều này sẽ chỉ ra liệu chuỗi có tạo các phần tử mảng có ý nghĩa hay không nếu phát nổ.

  4. Tôi nghĩ điều quan trọng là phải đề cập rằng bằng cách bùng nổ vô điều kiện, bạn được ĐẢM BẢO để tạo ra một mảng không trống. Đây là bằng chứng: Demo Nói cách khác, kiểm tra xem mảng trống có hoàn toàn vô dụng hay không - nó sẽ không trống mỗi lần.

  5. Nếu chuỗi của bạn sẽ KHÔNG CÓ giá trị bằng 0 (bởi vì, đây là một csv bao gồm các id bắt đầu từ 1và chỉ tăng), thì đó if ($gamerow['players']) {là tất cả những gì bạn cần - kết thúc câu chuyện.

  6. ... nhưng chờ đã, bạn đang làm gì sau khi xác định sự trống rỗng của giá trị này? Nếu bạn có một kịch bản không mong muốn $playerlist, nhưng bạn đang khai báo biến đó một cách có điều kiện, thì bạn có nguy cơ sử dụng giá trị của hàng trước đó hoặc tạo lại Thông báo. Vì vậy, bạn cần phải tuyên bố vô điều kiện $playerlistnhư một cái gì đó ? Nếu không có giá trị trung thực trong chuỗi, ứng dụng của bạn có được lợi khi khai báo một mảng trống không? Rất có thể, câu trả lời là có. Trong trường hợp này, bạn có thể đảm bảo rằng biến đó là kiểu mảng bằng cách quay lại một mảng trống - theo cách này sẽ không có vấn đề gì nếu bạn đưa biến đó vào một vòng lặp. Các khai báo có điều kiện sau đây là tất cả tương đương.

    • `if ($ gamerow ['player']) {$ playerlist = explode (',', $ gamerow ['player']); } khác {$ playerlist = []; }
    • $playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];

Tại sao tôi đã đi đến chiều dài như vậy để giải thích nhiệm vụ rất cơ bản này?

  1. Tôi đã thổi còi gần như mọi câu trả lời trên trang này và câu trả lời này có khả năng rút phiếu trả thù (điều này thường xảy ra với những người tố giác bảo vệ trang web này - nếu một câu trả lời có ý kiến ​​hạ thấp và không có bình luận, hãy luôn nghi ngờ).
  2. Tôi nghĩ điều quan trọng là Stackoverflow là một nguồn tài nguyên đáng tin cậy không gây độc cho các nhà nghiên cứu với thông tin sai lệch và kỹ thuật dưới mức tối ưu.
  3. Đây là cách tôi thể hiện mức độ quan tâm của tôi đối với các nhà phát triển sắp tới để họ tìm hiểu cách thức và lý do thay vì chỉ cho ăn một thế hệ lập trình viên sao chép.
  4. Tôi thường xuyên sử dụng các trang cũ để đóng các trang trùng lặp mới - đây là trách nhiệm của các tình nguyện viên kỳ cựu, những người biết cách nhanh chóng tìm thấy các bản sao. Tôi không thể tự mình sử dụng một trang cũ với thông tin xấu / sai / không tối ưu / sai lệch làm tài liệu tham khảo vì sau đó tôi đang tích cực thực hiện một dịch vụ cho nhà nghiên cứu mới.

@ptr nó đây rồi.
mickmackusa

1
empty($gamerow['players'])

đôi khi bạn không thể biết giá trị khóa của phần tử mảng $matches = preg_grep ( "/^$text (\w+)/i" , $array ) ; để kiểm tra xem tôi sử dụngif ( count ( $matches ) > 0 )
Salem

Giả định rằng cột tồn tại trong tập kết quả, do đó empty()đang thực hiện quá nhiều công việc.
mickmackusa

-1

Tôi đã giải quyết vấn đề này với mã sau đây.

$catArray=array();                          

$catIds=explode(',',$member['cat_id']);
if(!empty($catIds[0])){
foreach($catIds as $cat_id){
$catDetail=$this->Front_Category->get_category_detail($cat_id);
$catArray[]=$catDetail['allData']['cat_title'];
}
echo implode(',',$catArray);
}

1
Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn về đoạn mã, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách mô tả lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
sepehr

-3

Điều này dường như làm việc cho tất cả các trường hợp

if(!empty(sizeof($array)))

3
Điều này có quá nhiều chi phí. Giải pháp này không nên được thực hiện bởi bất kỳ nhà phát triển vì bất kỳ lý do.
mickmackusa

@mickmackusa Điểm tuyệt vời, nhưng làm thế nào một người mới học cách xác định hoạt động nào chiếm quá nhiều chi phí? Giveaway là gì, hoặc tiêu chí mệnh giá cho quá nhiều chi phí mà không chạy thử nghiệm hiệu suất là gì?
ptrcao

1
@ptr có một "chi phí" cho mỗi cuộc gọi chức năng. Nếu một tác vụ có thể được hoàn thành mà không có lệnh gọi hàm, nó sẽ vượt trội hơn một kỹ thuật sử dụng lệnh gọi hàm.
mickmackusa

@ptr Tôi đã đăng một câu trả lời toàn diện cho câu hỏi này. Tôi hy vọng nó sẽ xóa bất kỳ mối quan tâm của bạn về trang cụ thể này.
mickmackusa

@mickmackusa Ý của bạn là bao gồm một liên kết đến một bài viết khác?
ptrcao

-4

Làm thế nào về:

DepartmentPerSchool = mảng ();
(trống (is_array ($ DepartmentPerSchool)))? $ DepartmentPerSchool // hoặc echo không trống: mảng ('chưa được đặt' => 'Chưa được đặt. Liên hệ với Quản trị viên'); // hoặc echo trống
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.