Як перевірити, чи масив порожній за допомогою PHP?


470

playersбуде або порожнім, або списком, розділеним комами (або одним значенням). Який найпростіший спосіб перевірити, чи порожній він? Я припускаю, що можу це зробити, як тільки я забираю $gameresultмасив $gamerow? У цьому випадку, ймовірно, було б ефективніше пропустити вибух, $playerlistякщо він порожній, але заради аргументу, як би я перевірив, чи масив порожній?

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

2
Не використовуйте count (), sizeof (), empty (). Порожній масив return false: if ($ array) {
Limitrof

Відповіді:


773

Якщо вам просто потрібно перевірити, чи є в масиві БУДЬ-які елементи

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

Якщо вам потрібно очистити порожні значення перед перевіркою (зазвичай це робиться для запобігання explodeдивним рядкам):

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

2
Ви не повинні просто використовувати порожнє? для великих масивів буде потрібно більше часу.
Ден МакГрат

1
Зроблено. Я також змінив це на те, що вам не потрібно використовувати набір та інше.
Тайлер Картер

5
Враховуючи приклад його коду, змінна буде встановлена, тому вам не потрібно використовувати empty().
Коббі

4
ДЕРЖАВНО! if(!isset($emptyarray))є, falseале if(empty($emptyarray))повертається true. Що тільки що прибив мене
Каньйон Колоб

161

Порожній масив є фальсиєю в PHP, тому вам навіть не потрібно використовувати так, empty()як пропонували інші.

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

РНР empty()визначає , є чи змінна не існує або має значення falsey (наприклад array(), 0, null, falseі т.д.).

У більшості випадків ви просто хочете перевірити !$emptyVar. Використовуйте, empty($emptyVar)якщо змінна, можливо, не була встановлена ​​І ви не бажаєте запускати E_NOTICE; ІМО це взагалі погана ідея.


2
Я сподіваюся, що це не зміниться в якомусь стандарті ... буде боляче
Девід Костянтин

79

Деякі гідні відповіді, але я просто подумав, що я трохи розгорнусь, щоб пояснити більш чітко, коли PHP визначає, чи масив порожній.


Основні примітки:

Масив з ключем (або клавішами) буде визначений як НЕ порожній PHP.

Оскільки для значень масиву потрібні ключі, мати значення чи ні в масиві не визначає, чи він порожній, лише якщо немає ключів (І тому немає значень).

Тож перевірка масиву з empty()не просто говорить вам, чи є у вас значення чи ні, він повідомляє вам, чи масив порожній, а ключі є частиною масиву.


Тому подумайте, як ви створюєте свій масив, перш ніж вирішити, який метод перевірки використовувати.
EG Масив буде мати ключі , коли користувач відправляє вашу форму HTML , коли кожне поле форми має ім'я масиву (тобто name="array[]").
Для кожного поля буде створений не порожній масив, оскільки для масиву кожного форми поля будуть автоматизовані значення ключа.

Візьмемо для прикладу такі масиви:

/* 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[] = '';

Якщо ви відлучите ключі масиву та значення для вищевказаних масивів, ви отримаєте наступне:


ВІДПРАВКА : [UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]

ДРУГА ДРУГА:
[0] => [UserValue01]
[1] => [UserValue02]

ЗАРАЗ ТРИ:
[0] => []
[1] => []

І тестування вищевказаних масивів empty()повертає такі результати:


ДІЯЛЬНА : $ ArrayOne не порожній

ДРУГА ДРУГА:
$ ArrayTwo не порожній


ТРЕТИЙ АРРАЙ : $ ArrayThree не порожній

Масив завжди буде порожнім, коли ви призначите масив, але не використовуйте його після цього, наприклад:

$ArrayFour = array();

Це буде порожнім, тобто PHP поверне TRUE при використанні, якщо empty()зазначено вище.

Отже, якщо у вашому масиві є ключі - наприклад, за допомогою вхідних імен форми або якщо ви призначаєте їх вручну (тобто створіть масив із іменами стовпців бази даних як ключі, але ніяких значень / даних із бази даних), масив НЕ буде empty().

У цьому випадку ви можете зафіксувати масив в foreach, перевіривши, чи має кожен ключ значення. Це хороший метод, якщо вам потрібно все-таки пробігти масив, можливо перевірка ключів або санітарна обробка даних.

Однак це не найкращий метод, якщо вам просто потрібно знати, "якщо значення існують" повертає TRUE або FALSE . Існують різні методи визначення того, чи має масив якісь значення, коли відомо, що він матиме ключі. Функція або клас може бути найкращим підходом, але, як завжди, це залежить від вашого оточення та точних вимог, а також інших речей, таких як те, що ви зараз робите з масивом (якщо є що).


Ось підхід, який використовує дуже мало коду, щоб перевірити, чи має масив значення:

Використання array_filter():
Ітератує над кожним значенням масиву, передаючи їх функції зворотного дзвінка. Якщо функція зворотного дзвінка повертає значення true, поточне значення з масиву повертається в масив результатів. Клавіші масиву зберігаються.

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

Запуск array_filter()на всіх трьох прикладних масивах (створених у першому кодовому блоці у цій відповіді) призводить до наступного:

ПЕРШИЙ
ВЛАДЬ : $ arrayone не порожній

ДРУГА ДРУГА:
$ arraytwo не порожній


ДРУГА АРІЙ : $ arraythree порожній

Отже, коли немає значень, чи є ключі чи ні, використовуйте array_filter()для створення нового масиву, а потім перевірте, чи новий масив порожній, показує, чи були якісь значення у вихідному масиві.
Це не ідеально і трохи безладно, але якщо у вас є величезний масив і вам не потрібно перебирати його через будь-яку іншу причину, то це найпростіший з точки зору необхідний код.


Я не маю досвіду перевірки накладних витрат, але було б добре знати відмінності між використанням array_filter()та foreachперевіркою, чи знайдено значення.

Очевидно, що орієнтир повинен бути на різних параметрах, на малих та великих масивах і коли є значення, а не і т.д.


2
Дуже дякую за це. Це було дуже інформативно і вдалося вирішити мою проблему, використовуючиarray_filter()
Брайан Пауелл,

empty (array ()) завжди буде evaludate до FALSE, тому додавання count (array ()) == 0 призведе до true
timmz

1
@mboullouz count(array())==0помилковий, якщо є ключі та немає значень, тому це не допомагає перевірити лише значення. Ваше твердження правильне, але ви змушуєте тестувати, count(array())оскільки масив, звичайно, порожній. Нам потрібно перевірити, коли масив повернувся з форми чи десь ще, щоб знати, чи він порожній (ключі / значення) чи просто має значення чи ні
Джеймс

Це рішення ідеально підходить для такого типу масивів, наприклад, воно допомагає, коли потрібно перевірити вхідний файл array_filter($_FILES["documento"]['name'])
Gendrith


12

Якщо ви хочете встановити, чи змінна, яку ви тестуєте, насправді є порожнім масивом, ви можете використовувати щось подібне:

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

11

Якщо ви хочете виключити помилкові чи порожні рядки (наприклад, 0 => ''), коли використання empty()не вдасться, ви можете спробувати:

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

array_filter(): Якщо зворотний дзвінок не надається, всі записи масиву, що дорівнює FALSE (див. Перетворення на булева), будуть видалені.

Якщо ви хочете видалити всі NULL, FALSE та порожні рядки ( ''), але залишити нульові значення ( 0), ви можете використовувати strlenяк зворотний виклик, наприклад:

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

Це правильна відповідь на інше питання. Використання фільтра масиву знищить існуючі елементи зі значеннями фальси. Це не те, що просить ОП.
mickmackusa

8

Чому ніхто не сказав такої відповіді:

$array = [];

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

1
Ваше твердження невірне. Хтось DID сказав цю відповідь - Тім Огілві - роком раніше. Використання квадратних брекетів замість array()- те саме.
mickmackusa

Хоча під капотом це та сама відповідь ... технічно. Я використав квадратні дужки замість застарілої функції масиву.
Роб

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

is_array


Це зайві перевірки. ОП викликає explode()- повертає дані типу масиву. Перевірка empty()- це непотрібний виклик функції. Як заявив Коббі в 2012 році, if($detect)це все, що потрібно. Це рішення не повинно бути реалізовано для цього завдання чи інших. Ви можете стверджувати, що ви охоплюєте ситуації, що виходять за межі цього питання, ну, ніколи не потрібно дзвонити empty()ПІСЛЯ, is_array()тому що якщо змінна не "встановлена", то is_array()буде генеруватися "Примітка: Не визначена змінна", якщо isset()тоді empty()це надмірність, просто використовуйте Відповідь Кобі.
mickmackusa

6

Я провів орієнтир, включений в кінці посади. Для порівняння методів:

  • count($arr) == 0 : рахувати
  • empty($arr) : порожній
  • $arr == [] : комп
  • (bool) $arr : ролях

і отримали такі результати

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 */|

Різниця між пустим і кастинг булевим є незначною. Я проводив цей тест кілька разів, і вони, по суті, є рівнозначними. Вміст масивів, схоже, не відіграє значної ролі. Вони дають протилежні результати, але логічного заперечення навряд чи достатньо, щоб підштовхнути кастинг до виграшу більшу частину часу, тому я особисто віддаю перевагу порожньому заради розбірливості в будь-якому випадку.

#!/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";

Хороший тест, але ви забули sizeofщо псевдонім [нє?] empty... stackoverflow.com/a/51986794/1429432
Yousha Aleayoub

5

якщо ви хочете перевірити вміст масиву, який ви можете використовувати:

$arr = array();

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

дивіться тут: http://codepad.org/EORE4k7v


Як показав Cobby у 2012 році, зайвим є виклик функції, щоб перевірити, чи оголошений масив порожній чи ні.
mickmackusa

5

На мою думку, найпростішим способом для індексованого масиву було б просто:

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

Умова "якщо" в масиві буде оцінено як істинне, якщо масив не порожній і хибний, якщо масив порожній . Це не стосується асоціативних масивів.


Коббі ефективно заявив про цю методику ще у 2012 році. Зараз у його відповіді 133 відгуки.
mickmackusa

Це не є "найпростішим" питанням, а найпростішим, оскільки немає синтаксису, який може бути більш стислим, і це не має накладних функцій виклику. АБСОЛЮТНО НЕ РАЗЛИЧНО до доступу до масиву з індексованими ключами проти асоціативних ключів. Ця відповідь вводить в оману дослідників. Ця відповідь є зайвою , то неправильною . 3v4l.org/DSLha
mickmackusa

3

Я використовую цей код

$variable = array();

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

Але зауважте, що якщо масив має велику кількість клавіш, цей код витратить багато часу на їх перерахунок, порівняно з іншими відповідями тут.


Як показав Cobby у 2012 році, зайвим є виклик функції, щоб перевірити, чи оголошений масив порожній чи ні.
mickmackusa

3

Ви можете використовувати, array_filter()що чудово підходить для будь-яких ситуацій:

$ray_state = array_filter($myarray);

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

1
Ця відповідь використовує зайві перевірки. Перш за все, ОП не зацікавлений у фільтруванні будь-яких фальсифікованих значень з масиву, перш ніж перевірити його порожнечу - значить, ви відступили від розміщеного питання. По-друге, як показав Коббі в 2012 році, зайвим є виклик функції, щоб перевірити, чи оголошений масив порожній чи ні.
mickmackusa

2
 $gamerow = mysql_fetch_array($gameresult);

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

  // do stuf if array is empty
}

2

Я думаю, що найкращий спосіб визначити, чи масив порожній чи ні, - це використовувати count () так:

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

count()Виклик може бути повністю вилучений - см відповідь Cobby в.
mickmackusa

2

Прийняття найбільш прийнятного рішення вимагає знати якість ваших даних та які процеси слід дотримуватись.

  1. Якщо ви збираєтесь дискваліфікувати / знехтувати / видалити цей рядок, то найдавніша точка фільтрації повинна бути у запиті mysql.

    • WHERE players IS NOT NULL
    • WHERE players != ''
    • WHERE COALESCE(players, '') != ''
    • WHERE players IS NOT NULL AND players != ''
    • ... це залежить від ваших даних магазину, і будуть інші способи, я зупинюсь тут.
  2. Якщо ви не впевнені на 100%, чи буде стовпець існувати в наборі результатів, то слід перевірити, чи стовпець оголошено. Це буде означати , зателефонувавши array_key_exists(), isset()або empty()на колонці. Я не збираюся займатись виокремленням відмінностей тут (для цієї розбивки є інші сторінки SO, ось початок: 1 , 2 , 3 ). Це означає, що якщо ви не повністю контролюєте набір результатів, можливо, у вас є надмірна потурання програми "гнучкість", і вам слід переосмислити, чи варто того, щоб проблематично отримати доступ до неіснуючих даних стовпців. Я фактично кажу, що вам ніколи не потрібно перевіряти, чи оголошено стовпець - ерго вам ніколи не потрібно empty()для цього завдання. Якщо хтось це сперечаєтьсяempty()є більш доречним, тоді вони підштовхують власну особисту думку щодо виразності сценаріїв. Якщо ви вважаєте, що умова в №5 нижче є неоднозначною, додайте в код вбудований коментар, але я цього не став би. Суть полягає в тому, що програмного виклику немає програмної переваги.

  3. Чи може ваше значення рядка містити таке, 0яке ви хочете вважати істинним / дійсним / непорожнім? Якщо так, то вам потрібно лише перевірити, чи має значення стовпця довжину.

    Ось демонстрація за допомогою strlen(). Це вказуватиме, чи створюватиме рядок значущі елементи масиву при вибуху.

  4. Я думаю, що важливо згадати, що, безумовно, вибухаючи, ви ГАРАНТУЄтесь для створення не порожнього масиву. Ось доказ: Демо. Іншими словами, перевіряти, чи масив порожній є абсолютно марним - він буде не порожнім кожного разу.

  5. Якщо ваш рядок НЕ МОЖЕ містити нульове значення (тому що, скажімо, це csv, що складається з ідентифікаторів, які починаються з 1і тільки збільшуються), то if ($gamerow['players']) {все, що вам потрібно - кінець історії.

  6. ... але зачекайте, що ви робите після визначення порожнечі цієї цінності? Якщо у вас є щось вниз-сценарій, який очікує $playerlist, але ви умовно оголошуєте цю змінну, тоді ви ризикуєте використовувати значення попереднього рядка або знову генерувати повідомлення. Тож вам потрібно безумовно декларувати $playerlistяк щось ? Якщо в рядку немає правдивих значень, чи має ваша програма користь від оголошення порожнього масиву? Швидше за все, відповідь - так. У цьому випадку ви можете переконатися, що змінна має тип масиву, повернувшись до порожнього масиву - таким чином, це не має значення, чи подавати цю змінну в цикл. Наступні умовні декларації всі еквівалентні.

    • `if ($ gamerow ['гравці']) {$ playerlist = explode (',', $ gamerow ['гравці']); } else {$ playerlist = []; }
    • $playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];

Чому я пішов на таку довжину, щоб пояснити це дуже основне завдання?

  1. Я майже подав відповідь на кожну відповідь на цій сторінці, і ця відповідь, ймовірно, викликає помсту голосів (це часто трапляється до правопорушників, які захищають цей сайт - якщо у відповіді є зворотні записки та коментарі, завжди будьте скептичні).
  2. Я думаю, що важливо, щоб Stackoverflow був надійним ресурсом, який не отруює дослідників дезінформацією та субоптимальними методами.
  3. Ось так я показую, наскільки я дбаю про майбутніх розробників, щоб вони дізналися, як і чому замість того, щоб просто годувати ложкою покоління програмістів копіювальної пасти.
  4. Я часто використовую старі сторінки, щоб закрити нові дублікати сторінок - це обов'язок ветеранів-волонтерів, які знають, як швидко знайти дублікати. Я не можу змусити себе використовувати стару сторінку з поганою / неправдивою / субоптимальною / оманливою інформацією як орієнтиром, оскільки тоді я активно роблю послугу новому досліднику.

@ptr це тут.
mickmackusa

1
empty($gamerow['players'])

інколи ви не могли знати значення ключового значення масиву елементів, $matches = preg_grep ( "/^$text (\w+)/i" , $array ) ; щоб перевірити його, я використовуюif ( count ( $matches ) > 0 )
Salem

Передбачається, що стовпчик існує в наборі результатів, тому empty()робиться занадто багато роботи.
mickmackusa

-1

Я вирішив цю проблему за допомогою наступного коду.

$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
Ласкаво просимо до переповнення стека! Дякуємо за фрагмент коду, який може надати деяку обмежену, негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення , описавши, чому це хороше рішення проблеми, та зробило б її кориснішою для майбутніх читачів з іншими подібними питаннями. Відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
sepehr

-3

Здається, це працює у всіх випадках

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

3
Це занадто багато накладних витрат. Це рішення не повинно бути реалізовано жодним розробником з будь-якої причини.
mickmackusa

@mickmackusa Відмінний момент, але як новачок навчиться визначати, які операції становлять занадто багато накладних витрат? Що таке подарунки, або які критерії номінальної вартості занадто великі накладні витрати без запуску тестів на ефективність?
ptrcao

1
@ptr для кожного виклику функції існує "вартість". Якщо завдання можна виконати без виклику функції, воно перевершить техніку, яка використовує виклик функції.
mickmackusa

@ptr Я опублікував вичерпну відповідь на це питання. Я сподіваюся, що це усуне будь-які занепокоєння щодо цієї конкретної сторінки.
mickmackusa

@mickmackusa Ви мали на увазі включити посилання на іншу публікацію?
ptrcao

-4

Як щодо:

DepartmentPerSchool = масив ();
(порожній (is_array ($ DepartmentPerSchool)))? $ DepartmentPerSchool // або відлуння не порожнє: array ('не встановлено' => 'Не встановлено. Зверніться до адміністратора'); // або відлуння порожнє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.