Как проверить, является ли массив пустым с помощью PHP?

273

players будет либо пустым, либо списком, разделенным запятыми (или одним значением). Каков самый простой способ проверить, не пуст ли он? Я предполагаю, что могу сделать это, как только я принесу массив $gameresult в $gamerow? В этом случае, вероятно, было бы более эффективным пропустить взрыва $playerlist, если он пуст, но для аргумента, как бы проверить, пуст ли массив?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Теги:
arrays

15 ответов

412
Лучший ответ

Если вам просто нужно проверить, есть ли в массиве ЛЮБЫЕ элементы

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

Если вам нужно очистить пустые значения перед проверкой (как правило, для предотвращения explode странных строк):

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}
  • 1
    Разве вы не должны просто использовать пустой? подсчет займет больше времени для больших массивов.
  • 0
    Готово. Я также изменил это из-за того, что вам не нужно использовать isset и все такое.
Показать ещё 2 комментария
94

Пустой массив ошибочен в PHP, поэтому вам даже не нужно использовать empty(), как предложили другие.

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

PHP empty() определяет, не существует ли переменная или имеет значение false (например, array(), 0, null, false и т.д.).

В большинстве случаев вы просто хотите проверить !$emptyVar. Используйте empty($emptyVar), если переменная не была установлена. И вы не хотите запускать E_NOTICE; ИМО это вообще плохая идея.

  • 1
    Я надеюсь, что это не изменится в каком-то стандарте ... это будет больно
53

Некоторые достойные ответы, но просто подумал, что я немного расширю, чтобы объяснить более четко, когда 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]

ARRAY TWO:
[0] = > [UserValue01]
[1] = > [UserValue02]

МАССА ТРИ:
[0] = > []
[1] = > []

И тестирование вышеуказанных массивов с помощью empty() возвращает следующие результаты:

МАССА ОДИН:
$ ArrayOne не пуст

ARRAY TWO:
$ ArrayTwo не пуст

МАССА ТРИ:
$ ArrayThree не пуст

Массив всегда будет пустым, если вы назначаете массив, но не используете его после этого, например:

$ArrayFour = array();

Это будет пустым, то есть PHP вернет TRUE при использовании if empty() в приведенном выше.

Итак, если у вашего массива есть ключи - либо, например, имена ввода формы, либо если вы назначили их вручную (т.е. создайте массив с именами столбцов базы данных в качестве ключей, но нет значений/данных из базы данных), тогда массив НЕ be 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 не пуст

ARRAY TWO:
$ arraytwo не пуст

МАССА ТРИ:
$ arraythree пуст

Итак, когда нет значений, есть ли ключи или нет, используя array_filter() для создания нового массива, а затем проверьте, пуст ли новый массив, показывает, были ли какие-либо значения в исходном массиве. Это не идеально и немного беспорядочно, но если у вас огромный массив и не нужно его прокручивать по какой-либо другой причине, то это самый простой с точки зрения кода.


У меня нет опыта проверки накладных расходов, но было бы полезно узнать различия между использованием array_filter() и foreach проверки наличия значения.

Очевидно, что эталонный тест должен быть по разным параметрам, на малых и больших массивах и когда есть значения, а не т.д.

  • 2
    Большое спасибо за это. Это было действительно информативно и смогло решить мою проблему с помощью array_filter()
  • 0
    пусто (array ()) всегда будет равнозначно FALSE, поэтому добавление count (array ()) == 0 приведет к истине
Показать ещё 3 комментария
13
  • 0
    Старая школа да лучше как всегда, просто проверьте индекс массива.
7

Если вы хотите выяснить, действительно ли переменная, которую вы тестируете, явно пустым массивом, вы можете использовать что-то вроде этого:

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

is_array

3
 $gamerow = mysql_fetch_array($gameresult);

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

  // do stuf if array is empty
}
3

Я использую этот код

$variable = array();

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

Но обратите внимание, что если массив имеет большое количество ключей, этот код будет тратить много времени на их подсчет по сравнению с другими ответами здесь.

3
empty($gamerow['players'])
1

вы можете использовать array_filters, который отлично работает для всех ситуаций

$ray_state = array_filter($myarray);

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

если вы хотите проверить содержимое массива, которое вы можете использовать:

$arr = array();

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

см. здесь:   http://codepad.org/EORE4k7v

0

Я думаю, что лучший способ определить, пуст ли массив или нет, - использовать count() следующим образом:

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

Почему никто не ответил на этот ответ:

$array = [];

if($array == []) {
    // array is empty
}
  • 0
    Это, я думаю, самый простой способ проверить наличие пустых массивов.
-2

Как насчет:

DepartmentPerSchool = array();
(empty(is_array($DepartmentPerSchool))) ? $DepartmentPerSchool //or echo is not empty : array('not set'=>'Not set. Contact Admin'); //or echo is empty
-7

Вышеупомянутые решения не сработали для меня. Скорее, я использовал более надежный способ (может быть, накладные расходы):

$countarr = count($newArr); // Count the elements in an array.
$checkarr = "" ; //Initialize the value of variable to blank.
for($x=0;$x<$countarr;$x++)
{
  $checkarr = $newArr1[$x] ;
  if($checkarr != "" ) 
  {
       // do stuff if array is not empty.
  }
}
  • 6
    Я нахожу непостижимым, что ни один из существующих ответов не сработал. Для того, чтобы этот ответ работал, count($newArr) должен быть больше 0, как сказал ответ, опубликованный за 5 лет до этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню