Comprobando si todos los elementos de la matriz están vacíos PHP

81

Estoy agregando una matriz de elementos de un formulario y si todos están vacíos, quiero realizar una validación y agregar una cadena de error. Así que tengo:

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

Y luego, si todos los elementos de la matriz están vacíos, realice:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
Mate
fuente
5
Para cualquiera que lea esto y esté confundido, no incluya $ _POST entre comillas simples, ¡no se evaluará!
Jamie
2
Me tomé la libertad de editar las citas.
xtofl

Respuestas:

176

Puede usar el array_filter incorporado

Si no se proporciona ninguna devolución de llamada, se eliminarán todas las entradas de entrada iguales a FALSE (ver conversión a booleano).

Entonces puede hacer esto en una simple línea.

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
fuente
1
Tengo curiosidad por saber si esto es más rápido que el método de implosión que sugerí. ¿Algún punto de referencia alrededor?
Cápsula
array_filter()ya fue mencionado por @ dogmatic69. Acerca del rendimiento: creo que lo simple foreachdebería ser más rápido que ambos array_filter()y implode().
binaryLV
Aquí hay una gran vista para los puntos de referencia de php de funciones integradas phpbench.com pero presumiblemente dependería del tamaño de la matriz. Cuanto mayor sea la matriz, más rápido será este método.
xzyfer
1
@xzyfer, if(implode($array)) echo '..'imprimiría '..' incluso si un elemento de la matriz lo fuera (string)"0". Acerca de foreachser más lento que array_filter()... ¿estás seguro? ¿Cómo es más rápido eliminar elementos de la matriz uno por uno que simplemente leer elementos de la matriz?
binaryLV
2
@xzyfer, hice algunas pruebas: usar array_filter()solo para verificar si algún valor está lleno es al menos algunas veces más lento que el foreachciclo básico con alguna variable booleana para almacenar el resultado y breakel primer valor no válido. Incluso array_filter()siendo una "función PHP nativa", realmente no puede ser más rápido foreachya que tiene que crear una nueva variable de matriz.
binaryLV
20

implosione la matriz con un pegamento vacío y verifique el tamaño de la cadena resultante:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>
Cápsula
fuente
Puede eliminar la strlenllamada para que esto sea más eficiente. if(implode($array)) echo '..'
xzyfer
@binaryLV, ¿cómo es eso? Estuvieron de acuerdo en que ambos no lograron resolver el problema. Pero son desiguales, ¿no?
xzyfer
1
@xzyfer, si $stres (string)'0', luego strlen($str) == 0evalúa a false, mientras que !$strevalúa a true, por strlen($str) == 0lo tanto no se puede reemplazar con !$str.
binaryLV
Esta solución se siente más correcta en contraposición al uso array_filter, porque array_filterestá diseñada para usarse con una devolución de llamada, ya sabes, para filtrar una matriz. Pero todo lo que quieres hacer es comprobar el "vacío". Así que haces una cuerda y verificas su longitud. Brillante.
kasimir
2
@kasimir la función de devolución de llamada de array_filteres opcional y el manual indica claramente si no se proporciona ninguna devolución de llamada, todas las entradas de entrada iguales a FALSE (ver conversión a booleano) serán eliminadas. Entonces, usar array_filterno es menos correcto que esto, es solo un método diferente ;-)
Cápsula
7

Una pregunta anterior, pero pensé en incluir mi solución, ya que no se ha enumerado anteriormente.

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}
mulquin
fuente
1
empty()puede proporcionar resultados falsos positivos. Consulte el manual sobre cómo la función trata los falseyvalores. Recomendaría la llamada de en su strlen()lugar.
mickmackusa
Gracias por el recordatorio sobre falseyness @mickmackusa, lo he actualizado para comprobar explícitamente si hay una cadena vacía.
mulquin
2

realmente no lo necesitas.
Va a validar estos campos por separado y al finalizar este proceso podrá saber si la matriz estaba vacía (o contiene valores no válidos, que es lo mismo)

Tu sentido común
fuente
¡interesante! Me pregunto si esto es más rápido que la implosión de la matriz.
Cápsula
2
@ Cápsula para el tamaño de matriz de 6, nunca verá la más mínima diferencia, incluso si pasa toda su vida comprobando matrices. para los tamaños superiores a 1000, sugeriría no usar matrices en absoluto.
Tu sentido común
Dado que estamos hablando de sitios web, debe multiplicar eso por su número de visitantes. Una matriz de 1000 o 100 visitantes que calculen una matriz de 10 es igual en términos de costo de CPU. No puede decidir dejar de usar matrices porque su sitio web está ganando algo de popularidad ;-)
Cápsula
2

simplifique el uso de esta manera:

$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
fuente
0

Su definición de $ array es incorrecta y tiene comillas simples. Debería leer:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );
qbert220
fuente
3
Puedes usar cualquiera. Las comillas dobles son en realidad un poco más lentas.
Aaron Harun
@AaronHarun. Mira la versión original de la pregunta, que tenía extrañas citas incorrectas. Dicho esto, esto corrige eso, pero no intenta realmente responder la pregunta en sí.
TRiG
-1

Tenía la misma pregunta pero quería verificar cada elemento en la matriz por separado para ver cuál estaba vacío. Esto fue más difícil de lo esperado, ya que necesita crear los valores clave y los valores reales en matrices separadas para verificar y responder al elemento de matriz vacío.

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

Resultado:

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

La cantidad no puede estar vacía.

Cosworth66
fuente
¿Qué? Solo use foreach($array as $key => $value)y pruebe si $valueestá vacío o no.
Cápsula
-2

NO PROBADO PERO entiendes la lógica :)

$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
fuente
2
(no es mi voto negativo, pero ...) Este simplemente no es un enfoque estable / confiable. 3v4l.org/g3Jf6 Elimine esta respuesta para no confundir a los lectores o, peor aún, anímelos a utilizar un método inadecuado.
mickmackusa
-4

esto es bastante simple:

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

también tendría que cambiar su encapsulación para los valores de su matriz a comillas dobles.

RobertPitt
fuente
No necesita un número. Solo 1 es suficiente
su sentido común
¿Qué ?, quería saber si todos los elementos están vacíos, no hay un número, solo un booleano
RobertPitt
Creo que lo que Col. está diciendo groseramente es que en PHP tanto count($array) == 0y count($array)evalúan como verdaderos, por lo que los pasos adicionales de comparación y asignación son innecesarios. Aunque las asignaciones cuestan muy poco en php.
xzyfer
Ahhh sí, realmente no hace una gran diferencia, pero prefiero trabajar con boolean la mayor parte del tiempo, no entiendo por qué los votos negativos, es un método de trabajo y crea el resultado requerido.
RobertPitt
para decir si una matriz está vacía o no, es suficiente encontrar solo UN elemento lleno. se llama LÓGICA.
Tu sentido común