Sprawdzanie, czy wszystkie elementy tablicy są puste PHP


83

Dodaję tablicę elementów z formularza i jeśli wszystkie są puste, chcę przeprowadzić walidację i dodać do ciągu błędu. Więc mam:

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

A jeśli wszystkie elementy tablicy są puste, wykonaj:

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

5
Każdemu, kto to czyta, i jest zdezorientowany, nie umieszczaj znaku $ _POST w pojedynczych cudzysłowach - nie zostanie on oceniony!
Jamie

2
Pozwoliłem sobie zredagować cytaty.
xtofl

Odpowiedzi:


177

Możesz po prostu użyć wbudowanego filtra array_filter

Jeśli nie podano wywołania zwrotnego, wszystkie wpisy wejściowe równe FALSE (zobacz konwersję na wartość logiczną) zostaną usunięte.

Więc można to zrobić w jednej prostej linii.

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
Jestem ciekawy, czy jest to szybsze niż metoda implodowania, którą zasugerowałem. Czy jest jakiś punkt odniesienia?
Capsule

array_filter()zostało już wspomniane przez @ dogmatic69. O wydajności - uważam, że proste foreachpowinno być szybsze niż oba array_filter()i implode().
binaryLV

Oto wspaniały widok testów porównawczych php wbudowanych funkcji phpbench.com, ale prawdopodobnie zależy to od rozmiaru tablicy. Im większa tablica, tym szybsza byłaby ta metoda.
xzyfer,

1
@xzyfer, if(implode($array)) echo '..'wypisze „..”, nawet jeśli byłby jeden element tablicy (string)"0". O foreachbyciu wolniejszym niż array_filter()- czy na pewno? W jaki sposób usuwanie elementów tablicy jeden po drugim jest szybsze niż zwykłe odczytywanie elementów tablicy?
binaryLV

2
@xzyfer, zrobiłem kilka testów - użycie array_filter()tylko do sprawdzenia, czy jakakolwiek wartość jest wypełniona, jest co najmniej kilka razy wolniejsze niż podstawowa foreachpętla z jakąś zmienną boolowską do przechowywania wyniku i breakpierwszej nieprawidłowej wartości. Nawet array_filter()będąc „natywną funkcją PHP”, nie może być szybsze niż foreachtworzenie nowej zmiennej tablicowej.
binaryLV

22

imploduj tablicę pustym klejem i sprawdź rozmiar otrzymanego ciągu:

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

MOŻESZ usunąć strlenwywołanie, aby było to bardziej wydajne. if(implode($array)) echo '..'
xzyfer,

@binaryLV, jak to? Zgodzili się, że obaj nie rozwiązują problemu. Ale są one nierówne, prawda?
xzyfer,

1
@xzyfer, jeśli $strjest (string)'0', to szacuje się strlen($str) == 0na false, podczas gdy !$strevauluje na true, dlatego strlen($str) == 0nie można go zastąpić !$str.
binaryLV

To rozwiązanie wydaje się bardziej poprawne w przeciwieństwie do używania array_filter, ponieważ array_filterjest przeznaczone do użycia z wywołaniem zwrotnym, wiesz, do filtrowania tablicy. Ale wszystko, co chcesz zrobić, to sprawdzić, czy nie ma „pustki”. Robisz więc z niego ciąg i sprawdzasz jego długość. Znakomity.
kasimir

2
@kasimir funkcja wywołania zwrotnego array_filterjest opcjonalna, a instrukcja jasno stwierdza, że jeśli nie podano wywołania zwrotnego, wszystkie wpisy wejściowe równe FALSE (patrz konwersja na wartość logiczną) zostaną usunięte. Tak więc użycie array_filterjest nie mniej poprawne niż to, to tylko inna metoda ;-)
Capsule

7

Starsze pytanie, ale pomyślałem, że pojawię się w moim rozwiązaniu, ponieważ nie zostało wymienione powyżej.

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

1
empty()może dawać fałszywie dodatnie wyniki. Zobacz podręcznik, aby dowiedzieć się, jak funkcja traktuje falseywartości. Poleciłbym strlen()zamiast tego zadzwonić .
mickmackusa,

Dzięki za przypomnienie o falseyness @mickmackusa, zaktualizowałem je, aby bezpośrednio sprawdzać pusty ciąg.
mulquin

2

naprawdę tego nie potrzebujesz.
Zamierzasz zweryfikować te pola osobno i kończąc ten proces, możesz stwierdzić, czy tablica była pusta (lub zawiera nieprawidłowe wartości, które są takie same)


ciekawy! Zastanawiam się, czy to jest szybsze niż implodowanie tablicy.
Capsule

2
@Kapsułka dla rozmiaru tablicy 6, nigdy nie zobaczysz najmniejszej różnicy, nawet jeśli spędzisz całe życie na sprawdzaniu tablic. dla rozmiarów powyżej 1000 radziłbym w ogóle nie używać tablic.
Twój zdrowy rozsądek

Ponieważ mówimy o witrynach internetowych, musisz pomnożyć to przez liczbę odwiedzających. Tablica składająca się z 1000 lub 100 gości obliczająca tablicę 10 jest taka sama pod względem kosztu procesora. Nie możesz zrezygnować z używania tablic, ponieważ Twoja witryna zyskuje na popularności ;-)
Capsule,

2

uprość użycie w ten sposób:

$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

Twoja definicja tablicy $ jest niepoprawna i zawiera pojedyncze cudzysłowy. Powinien brzmieć:

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

3
Możesz użyć jednego z nich. Podwójne cudzysłowy są w rzeczywistości nieznacznie wolniejsze.
Aaron Harun

@AaronHarun. Spójrz na oryginalną wersję pytania, która zawierała dziwne, niepoprawne cytaty. To powiedziawszy, poprawia to, ale nie jest próbą odpowiedzi na samo pytanie.
TRiG

-1

Miałem to samo pytanie, ale chciałem sprawdzić każdy element tablicy oddzielnie, aby zobaczyć, który z nich jest pusty. Było to trudniejsze niż oczekiwano, ponieważ musisz utworzyć wartości kluczowe i rzeczywiste wartości w oddzielnych tablicach, aby sprawdzić i odpowiedzieć na pusty element tablicy.

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

Wynik:

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

Ilość nie może być pusta.


co? Po prostu użyj foreach($array as $key => $value)i sprawdź, czy $valuejest pusty lub nie.
Capsule

-2

NIE TESTOWANE, ALE masz logikę :)

$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
(nie mój przeciw, ale ...) To po prostu nie jest stabilne / niezawodne podejście. 3v4l.org/g3Jf6 Usuń tę odpowiedź, aby nie zmylić czytelników lub gorzej - zachęć ich do stosowania złej metody.
mickmackusa,

-4

to jest całkiem proste:

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

musiałbyś również zmienić sposób hermetyzacji wartości tablic na podwójne cudzysłowy.


Nie potrzebuje numeru. Wystarczy 1
Twój zdrowy rozsądek

Co? Chciał wiedzieć, czy wszystkie elementy są puste, nie ma liczby, tylko wartość logiczna
RobertPitt,

Myślę, że to, co mówi bezczelnie płk, to to, że w PHP zarówno, jak count($array) == 0i count($array)oceniają do wartości true, więc dodatkowe kroki porównania i przypisania są niepotrzebne. Chociaż zadania kosztują bardzo niewiele w php.
xzyfer,

Ahhh tak, to naprawdę nie robi dużej różnicy, ale wolałbym pracować przez większość czasu z booleanami, nie rozumiem jednak, dlaczego głosy w dół, to metoda pracy i zapewnia mu wymagany wynik.
RobertPitt,

aby powiedzieć, czy tablica jest pusta, czy nie, wystarczy znaleźć tylko JEDEN wypełniony element. nazywa się to LOGIC.
Twój zdrowy rozsądek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.