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>';
Matt
źródło
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>';
}
xzyfer
źródło
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'; ?>
Kapsuła
źródło
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;
}
mulquin
źródło
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)

Twój zdrowy rozsądek
źródło
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!';
Mehran Nasr
źródło
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"] );
qbert220
źródło
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.

Cosworth66
źródło
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>';
}
Val
źródło
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.

RobertPitt
źródło
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