Перевірка, чи всі елементи масиву порожні PHP


83

Я додаю масив елементів із форми, і якщо всі вони порожні, я хочу виконати перевірку та додати до рядка помилки. Отже я маю:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);

І тоді, якщо всі елементи масиву порожні, виконайте:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';

5
Кожному, хто читає це, хто заплутався, не вкладайте $ _POST в одинарні лапки - це не буде оцінено!
Джеймі

2
Я дозволив собі редагувати цитати.
xtofl

Відповіді:


177

Ви можете просто використовувати вбудований array_filter

Якщо зворотного виклику не надано, усі записи введення, рівні FALSE (див. Перетворення в логічне значення), будуть видалені.

Тож можна зробити це одним простим рядком.

if(!array_filter($array)) {
    echo '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

1
Мені цікаво дізнатися, чи це швидше, ніж метод імплодування, який я запропонував. Будь-який орієнтир?
Капсула

array_filter()вже згадував @ dogmatic69. Щодо продуктивності - я вважаю, що просте foreachмає бути швидшим, ніж обидва array_filter()і implode().
binaryLV

Ось чудовий приціл для тестів php вбудованих функцій phpbench.com, але, мабуть, це залежатиме від розміру масиву. Чим більший масив, тим швидшим буде цей метод.
xzyfer

1
@xzyfer, if(implode($array)) echo '..'надрукував би "..", навіть якщо б був один елемент масиву (string)"0". Про foreachте, щоб бути повільнішим за array_filter()- ти впевнений? Як видаляти елементи масиву один за одним швидше, ніж просто читати елементи масиву?
binaryLV

2
@xzyfer, я зробив кілька тестів - використання array_filter()просто для перевірки заповнення будь-якого значення принаймні в кілька разів повільніше базового foreachциклу з деякою логічною змінною для зберігання результату та breakпершого недійсного значення. Навіть array_filter()будучи "рідною функцією PHP", вона не може бути швидшою, ніж foreachтому, що вона повинна створювати нову змінну масиву.
binaryLV

22

імплодуйте масив порожнім клеєм і перевірте розмір отриманого рядка:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>

Ви можете прибрати strlenдзвінок, щоб зробити це більш ефективним. if(implode($array)) echo '..'
xzyfer

@binaryLV, як так? Погодились, що вони обидва не можуть вирішити проблему. Але вони нерівнозначні, чи не так?
xzyfer

1
@xzyfer, якщо $strє (string)'0', тоді strlen($str) == 0оцінює до false, а !$strевакуюється до true, тому strlen($str) == 0не може бути замінений на !$str.
binaryLV

Це рішення вважається більш правильним на противагу використанню array_filter, оскільки array_filterвоно призначене для використання із зворотним викликом, як ви знаєте, для фільтрації масиву. Але все, що ви хочете зробити, це перевірити наявність «порожнечі». Отже, ви робите з нього рядок і перевіряєте його довжину. Блискуче.
Казимир

2
@kasimir функція зворотного виклику не array_filterє обов’язковою, і в інструкції чітко зазначено. Якщо зворотного виклику не надано, всі записи введення, рівні FALSE (див. перетворення в логічне значення), будуть видалені. Отже, використання array_filterне менш правильне, ніж це, це просто інший метод ;-)
Капсула

7

Старіше запитання, але я думав, що я запропоную своє рішення, оскільки воно не було перераховано вище.

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}

1
empty()може давати хибнопозитивні результати. Дивіться посібник про те, як функція обробляє falseyзначення. Я б рекомендував зателефонувати strlen()замість цього.
mickmackusa

Дякуємо за нагадування про хибність @mickmackusa, я оновив його до перевірки явності на наявність порожнього рядка.
mulquin 02.03.18

2

вам це насправді не потрібно.
Ви збираєтеся перевірити ці поля окремо, і закінчивши цей процес, ви зможете визначити, чи масив був порожнім (або містить недійсні значення, що є однаковим)


цікаво! Цікаво, чи це швидше, ніж вибухування масиву.
Капсула

2
@Capsule для масиву розміром 6, ви ніколи не побачите ні найменшої різниці, навіть якщо ви витрачаєте все своє життя на перевірку масивів. для розмірів більше 1000 я б пропонував взагалі не використовувати масиви.
Ваш здоровий глузд

Оскільки ми говоримо про веб-сайти, ви повинні помножити це на кількість відвідувачів. Масив з 1000 або 100 відвідувачів, що обчислює масив з 10, однаковий з точки зору вартості процесора. Ви не можете вирішити припинити використання масивів, оскільки ваш веб-сайт набуває певної популярності ;-)
Капсула

2

спростіть використання таким чином:

$array = []; //target array
$is_empty = true; //flag

foreach ($array as $key => $value) {
    if ($value != '')
        $is_empty = false;
}
if ($is_empty)
    echo 'array is empty!';
else
    echo 'array is not empty!';

0

Визначення масиву $ неправильне і містить одинарні лапки. Він повинен читати:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );

3
Ви можете використовувати будь-який. Подвійні лапки насправді незначно повільніші.
Аарон Харун,

@AaronHarun. Подивіться на оригінальну версію запитання, в якій були дивні неправильні цитати. Тим не менш, це виправляє це, але не намагається насправді відповісти на саме питання.
TRiG

-1

У мене було те саме запитання, але я хотів перевірити кожен елемент масиву окремо, щоб побачити, який з них порожній. Це було важче, ніж очікувалося, оскільки вам потрібно створити значення ключів та фактичні значення в окремих масивах, щоб перевірити та відповісти на порожній елемент масиву.

print_r($requestDecoded);
$arrayValues = array_values($requestDecoded);  //Create array of values
$arrayKeys = array_keys($requestDecoded);      //Create array of keys to count
$count = count($arrayKeys);
for($i = 0; $i < $count; $i++){  
    if ( empty ($arrayValues[$i] ) ) {         //Check which value is empty
        echo $arrayKeys[$i]. " can't be empty.\r\n";
    } 
}

Результат:

Array
(
    [PONumber] => F12345
    [CompanyName] => Test
    [CompanyNum] => 222222
    [ProductName] => Test
    [Quantity] =>
    [Manufacturer] => Test
)

Кількість не може бути порожньою.


що? Просто використовуйте foreach($array as $key => $value)і перевіряйте, якщо $valueпорожньо ні.
Капсула

-2

НЕ ТЕСТУВАЛИСЯ, але у вас логіка :)

$error = 0;
foreach ($array as $k => $v){
    if (empty($v)) {
        $error++;
    }
}

if ($error == count($array)) {
    $error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

2
(не мій голос проти, але ...) Це просто не стабільний / надійний підхід. 3v4l.org/g3Jf6 Будь ласка, видаліть цю відповідь, щоб не заплутувати читачів або ще гірше - заохочуйте їх використовувати поганий метод.
mickmackusa

-4

це досить просто:

foreach($array as $k => $v)
{
    if(empty($v))
    {
        unset($array[$k]);
    }
}
$show_error = count($array) == 0;

вам також довелося б змінити інкапсуляцію для значень масиву на подвійні лапки.


Йому не потрібен номер. Достатньо лише 1
Ваш здоровий глузд

Що ?, він хотів знати, чи всі елементи порожні, немає числа, просто логічне значення
RobertPitt

Я думаю, що полковник безжально говорить, що в PHP обидва count($array) == 0і count($array)оцінюють як істинні, тому додаткові етапи порівняння та призначення непотрібні підслухані. Хоча завдання коштують дуже мало в php.
xzyfer

Так, так, це насправді не має великої різниці, але я б волів більшу частину часу працювати з булевим, я не розумію, чому голоси проти, це робочий метод і створює йому необхідний результат.
Роберт Пітт,

сказати, якщо масив порожній чи ні, досить знайти лише ОДИН заповнений елемент. це називається ЛОГІКА.
Ваш здоровий глузд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.