Überprüfen, ob alle Array-Elemente leer sind PHP

83

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>';
Matt
quelle
5
Wenn Sie dies lesen und verwirrt sind, schließen Sie $ _POST nicht in einfache Anführungszeichen ein - es wird nicht bewertet!
Jamie
2
Ich habe mir die Freiheit genommen, die Zitate zu bearbeiten.
xtofl

Antworten:

176

Sie können einfach den eingebauten array_filter verwenden

Wenn kein Rückruf bereitgestellt wird, werden alle Eingabeeinträge gleich FALSE (siehe Konvertieren in Boolesche Werte) entfernt.

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>';
}
xzyfer
quelle
1
Ich bin gespannt, ob dies schneller ist als die von mir vorgeschlagene implodierende Methode. Gibt es einen Benchmark?
Kapsel
array_filter()wurde bereits von @ dogmatic69 erwähnt. Über Leistung - Ich glaube, einfach foreachsollte schneller sein als beide array_filter()und implode().
binaryLV
Hier ist ein großartiger Anblick für PHP-Benchmarks der eingebauten Funktionen von phpbench.com, aber vermutlich würde dies von der Größe des Arrays abhängen. Je größer das Array, desto schneller wäre diese Methode.
Xzyfer
1
@xzyfer, if(implode($array)) echo '..'würde '..' drucken, selbst wenn ein Array-Element wäre (string)"0". Langsamer zu foreachsein als array_filter()- bist du dir sicher? Wie kann man Array-Elemente einzeln schneller entfernen als nur Array-Elemente lesen?
binaryLV
2
@xzyfer, ich habe einige Tests durchgeführt. array_filter()Nur zu überprüfen, ob ein Wert gefüllt ist, ist mindestens einige Male langsamer als die Basisschleife foreachmit einer booleschen Variablen zum Speichern des Ergebnisses und breakbeim ersten ungültigen Wert. Selbst array_filter()wenn es sich um eine "native PHP-Funktion" handelt, kann sie nicht schneller sein, als foreachwenn eine neue Array-Variable erstellt werden muss.
binaryLV
22

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'; ?>
Kapsel
quelle
Sie könnten den strlenAnruf entfernen , um dies effizienter zu gestalten. if(implode($array)) echo '..'
Xzyfer
@binaryLV, wie so? Einverstanden, dass beide das Problem nicht lösen können. Aber sie sind nicht gleichwertig, nicht wahr?
Xzyfer
1
@xzyfer, wenn dies der Fall $strist (string)'0', wird strlen($str) == 0ausgewertet false, während es !$strausgewertet wird, truekann daher strlen($str) == 0nicht durch ersetzt werden !$str.
binaryLV
Diese Lösung fühlt sich korrekter an als die Verwendung array_filter, da array_filtersie 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.
Kasimir
2
@kasimir Die Rückruffunktion von array_filterist 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 Verwendung array_filterist also nicht weniger korrekt als diese, es ist nur eine andere Methode ;-)
Kapsel
7

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;
}
Mulquin
quelle
1
empty()kann zu falsch positiven Ergebnissen führen. Informationen zur Behandlung von falseyWerten finden Sie im Handbuch . Ich würde stattdessen den Anruf von empfehlen strlen().
Mickmackusa
Vielen Dank für die Erinnerung an falseyness @mickmackusa. Ich habe es aktualisiert, um die Explizitätsprüfung auf leere Zeichenfolgen zu überprüfen.
Mulquin
2

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).

Ihr gesunder Menschenverstand
quelle
interessant! Ich frage mich, ob dies schneller ist als das Implodieren des Arrays.
Kapsel
2
@Capsule für die Array-Größe von 6, Sie werden nie den geringsten Unterschied sehen, selbst wenn Sie Ihr ganzes Leben damit verbringen, Arrays zu überprüfen. Für Größen über 1000 würde ich empfehlen, überhaupt keine Arrays zu verwenden.
Ihr gesunder Menschenverstand
Da es sich um Websites handelt, müssen Sie diese mit Ihrer Besucherzahl multiplizieren. Ein Array von 1000 oder 100 Besuchern, die ein Array von 10 berechnen, ist hinsichtlich der CPU-Kosten gleich. Sie können sich nicht entscheiden, die Verwendung von Arrays einzustellen, da Ihre Website immer beliebter wird ;-)
Capsule
2

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!';
Mehran Nasr
quelle
0

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"] );
qbert220
quelle
3
Sie können entweder verwenden. Doppelte Anführungszeichen sind tatsächlich geringfügig langsamer.
Aaron Harun
@ AaronHarun. Schauen Sie sich die Originalversion der Frage an, die seltsame falsche Anführungszeichen hatte. Dies korrigiert das zwar, versucht aber nicht, die Frage selbst zu beantworten.
TRiG
-1

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.

Cosworth66
quelle
Was? Verwenden Sie einfach foreach($array as $key => $value)und testen Sie, ob $valueleer von nicht ist.
Kapsel
-2

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>';
}
Val
quelle
2
(nicht meine Ablehnung, aber ...) Dies ist einfach kein stabiler / zuverlässiger Ansatz. 3v4l.org/g3Jf6 Bitte entfernen Sie diese Antwort, damit Sie die Leser nicht verwirren oder schlimmer noch - ermutigen Sie sie, eine schlechte Methode anzuwenden.
Mickmackusa
-4

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.

RobertPitt
quelle
Er braucht keine Nummer. Nur 1 ist genug
Ihr gesunder Menschenverstand
Was?, Er wollte wissen, ob alle Elemente leer sind, es gibt keine Zahl, nur einen Booleschen
Wert
Ich denke, was Col. krass sagt, ist, dass in PHP beide count($array) == 0und count($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.
Xzyfer
Ahhh ja, es macht keinen großen Unterschied, aber ich würde die meiste Zeit lieber mit Booleschen arbeiten. Ich verstehe nicht, warum die Abstimmungen stimmen, es ist eine Arbeitsmethode und schafft ihm das erforderliche Ergebnis.
RobertPitt
Um zu sagen, ob ein Array leer ist oder nicht, reicht es aus, nur EIN gefülltes Element zu finden. es heißt LOGIC.
Ihr gesunder Menschenverstand