Некоторые приличные ответы, но я подумал, что я бы немного расширил их, чтобы объяснить более четко, когда 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]
ARRAY TWO:
[0] => [UserValue01]
[1] => [UserValue02]
Массив третий:
[0] => []
[1] => []
И тестирование вышеупомянутых массивов с empty()
возвращает следующие результаты:
ARRAY ONE:
$ ArrayOne не пусто
ARRAY TWO:
$ ArrayTwo не пусто
ARRAY THREE:
$ ArrayThree не пусто
Массив всегда будет пустым, когда вы назначаете массив, но не используете его после этого, например:
$ArrayFour = array();
Это будет пустым, то есть PHP вернет TRUE при использовании if 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
проверкой, найдено ли значение.
Очевидно, что эталонный тест должен быть по различным параметрам, по маленьким и большим массивам, и когда есть значения, а не и т.д.