6

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

1

Заголовок: Как проверить, является ли список игроков пустым перед разделением строки?

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

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

Вот часть моего кода:

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

Как правильно реализовать проверку?

5 ответ(ов)

10

Если вам просто нужно проверить, есть ли элементы в массиве, вы можете использовать сам массив благодаря слабой типизации PHP, или, если вы предпочитаете более строгий подход, используйте count():

if (!$playerlist) {
    // Массив пустой.
}
if (count($playerlist) === 0) {
    // Массив пустой.
}

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

foreach ($playerlist as $key => $value) {
    if (!strlen($value)) {
        unset($playerlist[$key]);
    }
}
if (!$playerlist) {
    // Пустой массив
}
1

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


Основные заметки:

Массив с ключом (или ключами) будет считаться НЕ пустым в PHP.

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

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


Учтите, как вы создаете свой массив, прежде чем решить, какой метод проверки использовать.

Например, массив будет иметь ключи, когда пользователь отправляет вашу HTML-форму, если у каждого поля формы есть имя массива (например, name="array[]").

Для каждого поля формы будет создан непустой массив, так как для каждого поля формы будут автоматически увеличиваться ключевые значения.

Приведем следующие примеры массивов:

/* Присвоение некоторых массивов */

// Массив с заданным пользователем ключом и значением
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");

// Массив с автоинкрементируемым ключом и заданным пользователем значением
// как если бы поле формы возвращалось с пользовательским вводом
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";

// Массив с автоинкрементированным ключом и без значения
// как если бы поле формы возвращалось без пользовательского ввода
$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))
{
    // выполнить некоторые проверки значений в $ArrayOne
}
else
{
    // Вероятно, нет необходимости в else, 
    // но можно вернуть сообщение пользователю "вы ничего не ввели" и так далее
}

Запуск array_filter() для всех трех примеров массивов (созданных в первом кодовом блоке этого ответа) даёт следующие результаты:

МАССИВ ПЕРВЫЙ:

$arrayone не пустой

МАССИВ ВТОРОЙ:

$arraytwo не пустой

МАССИВ ТРЕТИЙ:

$arraythree пустой

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

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


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

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

0

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

if ($variableToTest === array()) {
    echo 'это явно пустой массив!';
}

Такой способ сравнения с пустым массивом (array()) гарантирует, что вы проверяете именно тип переменной и её пустоту.

0

Если вам нужно проверить содержимое массива, вы можете использовать следующий код:

$arr = array();

if (!empty($arr)) {
    echo "не пустой";
} else {
    echo "пустой";
}

Смотрите также:
http://codepad.org/EORE4k7v

0

Я провел тестирование, включенное в конце поста, чтобы сравнить несколько методов проверки массива на пустоту:

  • count($arr) == 0 : count
  • empty($arr) : empty
  • $arr == [] : comp
  • (bool) $arr : cast

И вот результаты, которые я получил:

Содержимое  \метод |    count     |    empty     |     comp     |     cast     |
------------------|--------------|--------------|--------------|--------------|
            Пустой |/* 1.213138 */|/* 1.070011 */|/* 1.628529 */|   1.051795   |
          Однородный |/* 1.206680 */|   1.047339   |/* 1.498836 */|/* 1.052737 */|
          Целый |/* 1.209668 */|/* 1.079858 */|/* 1.486134 */|   1.051138   |
           Строка |/* 1.242137 */|   1.049148 */|/* 1.630259 */|/* 1.056610 */|
            Разнородный |/* 1.229072 */|/* 1.068569 */|/* 1.473339 */|   1.064111   |
      Ассоциативный |/* 1.206311 */|   1.053642   |/* 1.480637 */|/* 1.137740 */|
------------------|--------------|--------------|--------------|--------------|
            Итого |/* 7.307005 */|   6.368568   |/* 9.197733 */|/* 6.414131 */|

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

Код для тестирования выглядит следующим образом:

#!/usr/bin/php
<?php

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

// Меряем время выполнения для каждого метода 
...

[Здесь вы можете добавить ваш код и описание, как он работает, если потребуется.]

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь