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>';
php
arrays
validation
Matt
źródło
źródło
Odpowiedzi:
Możesz po prostu użyć wbudowanego filtra array_filter
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>'; }
źródło
array_filter()
zostało już wspomniane przez @ dogmatic69. O wydajności - uważam, że prosteforeach
powinno być szybsze niż obaarray_filter()
iimplode()
.if(implode($array)) echo '..'
wypisze „..”, nawet jeśli byłby jeden element tablicy(string)"0"
. Oforeach
byciu 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?array_filter()
tylko do sprawdzenia, czy jakakolwiek wartość jest wypełniona, jest co najmniej kilka razy wolniejsze niż podstawowaforeach
pętla z jakąś zmienną boolowską do przechowywania wyniku ibreak
pierwszej nieprawidłowej wartości. Nawetarray_filter()
będąc „natywną funkcją PHP”, nie może być szybsze niżforeach
tworzenie nowej zmiennej tablicowej.imploduj tablicę pustym klejem i sprawdź rozmiar otrzymanego ciągu:
<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>
źródło
strlen
wywołanie, aby było to bardziej wydajne.if(implode($array)) echo '..'
$str
jest(string)'0'
, to szacuje sięstrlen($str) == 0
nafalse
, podczas gdy!$str
evauluje natrue
, dlategostrlen($str) == 0
nie można go zastąpić!$str
.array_filter
, ponieważarray_filter
jest 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.array_filter
jest 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życiearray_filter
jest nie mniej poprawne niż to, to tylko inna metoda ;-)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; }
źródło
empty()
może dawać fałszywie dodatnie wyniki. Zobacz podręcznik, aby dowiedzieć się, jak funkcja traktujefalsey
wartości. Poleciłbymstrlen()
zamiast tego zadzwonić .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)
źródło
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!';
źródło
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"] );
źródło
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.
źródło
foreach($array as $key => $value)
i sprawdź, czy$value
jest pusty lub nie.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>'; }
źródło
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.
źródło
count($array) == 0
icount($array)
oceniają do wartości true, więc dodatkowe kroki porównania i przypisania są niepotrzebne. Chociaż zadania kosztują bardzo niewiele w php.