Как проверить, является ли массив пустым с помощью PHP? - PullRequest
409 голосов
/ 07 февраля 2010

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

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

Ответы [ 19 ]

652 голосов
/ 07 февраля 2010

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

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

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

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}
139 голосов
/ 30 августа 2012

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

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

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

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

75 голосов
/ 24 ноября 2013

Некоторые приличные ответы, но я подумал, что я бы немного расширил их, чтобы объяснить более четко, когда PHP определяет, является ли массив пустым.


Основные примечания:

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

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

Таким образом, проверка массива с помощью empty() не просто говорит вам, есть ли у вас значения или нет, она говорит вам, является ли массив пустым, и ключи являются частью массива.


Итак, подумайте, как вы создаете свой массив, прежде чем решить, какой метод проверки использовать.
Например, массив будет иметь ключи, когда пользователь отправляет 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[] = '';

Если вы выводите ключи массива и значения для вышеуказанных массивов, вы получаете следующее:

ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]

Массив второй:
[0] => [UserValue01]
[1] => [UserValue02]

Массив 3:
[0] => []
[1] => []

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

ARRAY ONE:
$ ArrayOne не пусто

Массив второй:
$ ArrayTwo не пусто

Массив 3:
$ 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() на всех трех примерах массивов (созданных в первом блоке кода в этом ответе) приводит к следующему:

ARRAY ONE:
$ arrayone не пустой

Массив второй:
$ arraytwo не пусто

Массив 3:
$ arraythree пусто

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


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

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

18 голосов
/ 07 февраля 2010
10 голосов
/ 25 августа 2016

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

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}
6 голосов
/ 05 октября 2013
is_array($detect) && empty($detect);

is_array

6 голосов
/ 11 ноября 2017

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

$array = [];

if($array == []) {
    // array is empty
}
5 голосов
/ 31 октября 2018

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

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

array_filter(): Если обратный вызов не предоставлен, все записи массива, равные FALSE (см. Преобразование в логическое значение), будут удалены.

Если вы хотите удалить все NULL, FALSE и пустые строки (''), но оставить нулевые значения (0), вы можете использовать strlen в качестве обратного вызова, например ::

$is_empty = array_filter($playerlist, 'strlen') == [];
4 голосов
/ 26 сентября 2013

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

$arr = array();

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

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

3 голосов
/ 23 декабря 2016
 $gamerow = mysql_fetch_array($gameresult);

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

  // do stuf if array is empty
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...