Ich füge ein Array von Elementen aus einem Formular hinzu. Wenn alle leer sind, möchte ich eine Validierung durchführen und einer Fehlerzeichenfolge hinzufügen. Also habe ich:
$array = array(
'RequestID' => $_POST["RequestID"],
'ClientName' => $_POST["ClientName"],
'Username' => $_POST["Username"],
'RequestAssignee' => $_POST["RequestAssignee"],
'Status' => $_POST["Status"],
'Priority' => $_POST["Priority"]
);
Und wenn dann alle Array-Elemente leer sind, führen Sie Folgendes aus:
$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
quelle
quelle
Antworten:
Sie können einfach den eingebauten array_filter verwenden
Kann dies also in einer einfachen Zeile tun.
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>'; }
quelle
array_filter()
wurde bereits von @ dogmatic69 erwähnt. Über Leistung - Ich glaube, einfachforeach
sollte schneller sein als beidearray_filter()
undimplode()
.if(implode($array)) echo '..'
würde '..' drucken, selbst wenn ein Array-Element wäre(string)"0"
. Langsamer zuforeach
sein alsarray_filter()
- bist du dir sicher? Wie kann man Array-Elemente einzeln schneller entfernen als nur Array-Elemente lesen?array_filter()
Nur zu überprüfen, ob ein Wert gefüllt ist, ist mindestens einige Male langsamer als die Basisschleifeforeach
mit einer booleschen Variablen zum Speichern des Ergebnisses undbreak
beim ersten ungültigen Wert. Selbstarray_filter()
wenn es sich um eine "native PHP-Funktion" handelt, kann sie nicht schneller sein, alsforeach
wenn eine neue Array-Variable erstellt werden muss.implodieren Sie das Array mit einem leeren Kleber und überprüfen Sie die Größe der resultierenden Zeichenfolge:
<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>
quelle
strlen
Anruf entfernen , um dies effizienter zu gestalten.if(implode($array)) echo '..'
$str
ist(string)'0'
, wirdstrlen($str) == 0
ausgewertetfalse
, während es!$str
ausgewertet wird,true
kann daherstrlen($str) == 0
nicht durch ersetzt werden!$str
.array_filter
, daarray_filter
sie mit einem Rückruf verwendet werden soll, um ein Array zu filtern . Aber alles, was Sie tun möchten, ist auf Leere zu prüfen. Also machst du einen String daraus und überprüfst seine Länge. Brillant.array_filter
ist optional und im Handbuch wird eindeutig angegeben. Wenn kein Rückruf bereitgestellt wird, werden alle Eingaben von Eingaben gleich FALSE (siehe Konvertieren in Boolesche Werte) entfernt. Die Verwendungarray_filter
ist also nicht weniger korrekt als diese, es ist nur eine andere Methode ;-)Eine ältere Frage, aber ich dachte, ich würde meine Lösung einfügen, da sie oben nicht aufgeführt ist.
function isArrayEmpty($array) { foreach($array as $key => $val) { if ($val !== '') return false; } return true; }
quelle
empty()
kann zu falsch positiven Ergebnissen führen. Informationen zur Behandlung vonfalsey
Werten finden Sie im Handbuch . Ich würde stattdessen den Anruf von empfehlenstrlen()
.du brauchst es nicht wirklich.
Sie werden diese Felder separat validieren und nach Abschluss dieses Vorgangs können Sie feststellen, ob das Array leer war (oder ungültige Werte enthält, was gleich ist).
quelle
Vereinfachen Sie die Verwendung auf folgende Weise:
$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!';
quelle
Ihre Definition von $ array ist falsch und enthält einfache Anführungszeichen. Es sollte lauten:
$array = array( 'RequestID' => $_POST["RequestID"], 'ClientName' => $_POST["ClientName"], 'Username' => $_POST["Username"], 'RequestAssignee' => $_POST["RequestAssignee"], 'Status' => $_POST["Status"], 'Priority' => $_POST["Priority"] );
quelle
Ich hatte die gleiche Frage, wollte aber jedes Element im Array einzeln überprüfen, um festzustellen, welches leer war. Dies war schwieriger als erwartet, da Sie die Schlüsselwerte und die tatsächlichen Werte in separaten Arrays erstellen müssen, um das leere Array-Element zu überprüfen und darauf zu reagieren.
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"; } }
Ergebnis:
Array ( [PONumber] => F12345 [CompanyName] => Test [CompanyNum] => 222222 [ProductName] => Test [Quantity] => [Manufacturer] => Test )
Menge kann nicht leer sein.
quelle
foreach($array as $key => $value)
und testen Sie, ob$value
leer von nicht ist.NICHT GETESTET, ABER du verstehst die 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>'; }
quelle
das ist ziemlich einfach:
foreach($array as $k => $v) { if(empty($v)) { unset($array[$k]); } } $show_error = count($array) == 0;
Sie müssten auch Ihre Kapselung für Ihre Array-Werte in doppelte Anführungszeichen ändern.
quelle
count($array) == 0
undcount($array)
als wahr ausgewertet werden, so dass die zusätzlichen Vergleichs- und Zuweisungsschritte unnötig belauscht werden. Obwohl Aufträge in PHP sehr wenig kosten.