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