Деякі гідні відповіді, але я просто подумав, що я трохи розгорнусь, щоб пояснити більш чітко, коли 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]
ДРУГА ДРУГА:
[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))
{
// 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 не порожній
ДРУГА ДРУГА:
$ arraytwo не порожній
ДРУГА АРІЙ : $ arraythree порожній
Отже, коли немає значень, чи є ключі чи ні, використовуйте array_filter()
для створення нового масиву, а потім перевірте, чи новий масив порожній, показує, чи були якісь значення у вихідному масиві.
Це не ідеально і трохи безладно, але якщо у вас є величезний масив і вам не потрібно перебирати його через будь-яку іншу причину, то це найпростіший з точки зору необхідний код.
Я не маю досвіду перевірки накладних витрат, але було б добре знати відмінності між використанням array_filter()
та foreach
перевіркою, чи знайдено значення.
Очевидно, що орієнтир повинен бути на різних параметрах, на малих та великих масивах і коли є значення, а не і т.д.