2011-02-18 13 views
54

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

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

Y entonces, si todos los elementos de la matriz están vacías realizar:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>'; 
+5

Para cualquiera que lea esto que está confundido, no encierran $ _POST entre comillas simples - que ganó no se evaluará! – Jamie

+0

Me tomé la libertad de editar las citas. – xtofl

Respuesta

121

sólo puede utilizar el construido en array_filter

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

Así que puede hacer esto en una línea simple.

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>'; 
} 
+1

Tengo curiosidad por saber si esto es más rápido que el método de implosión que sugerí. Cualquier punto de referencia alrededor? – Capsule

+0

'array_filter()' ya fue mencionado por @ dogmatic69. Acerca del rendimiento: creo que el simple 'foreach' debe ser más rápido que los' 'array_filter()' y 'implode()'. – binaryLV

+0

Aquí hay una gran vista para los puntos de referencia php de las funciones integradas http://www.phpbench.com/, pero presumiblemente dependerá del tamaño de la matriz. Cuanto más grande sea la matriz, más rápido será este método. – xzyfer

-1

NO PROBADO PERO U obtener 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>'; 
} 
+0

(no es mi voto negativo, pero ...) Esto simplemente no es un enfoque estable/confiable. https://3v4l.org/g3Jf6 Elimine esta respuesta para que no confunda a los lectores o, peor aún, anímelos a utilizar un método incorrecto. – mickmackusa

0

Su definición de $ array es incorrecto y tiene comillas simples. Se debería leer:

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

Puedes usar cualquiera. Las comillas dobles son marginalmente más lentas. –

+0

El OP colocó los $ dentro de comillas simples. Eso es incorrecto. – qbert220

+0

@downvoter - explique el motivo de su voto a la baja – qbert220

13

implosionar la matriz con una cola vacía y comprobar el tamaño de la cadena resultante:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?> 
+0

Podría eliminar la llamada 'strlen' para hacer esto más eficiente. 'if (implode ($ array)) echo '..'' – xzyfer

+1

@xzyfer, no es lo mismo. – binaryLV

+0

@binaryLV, ¿cómo es eso? De acuerdo que ambos no pueden resolver el problema. Pero son inequitativos, ¿verdad? – xzyfer

2

que realmente no lo necesita.
vas a validar estos campos por separado y al terminar este proceso se puede saber si arsenal estaba vacío (o contiene valores no válidos, lo que es lo mismo)

+0

¡Interesante! Me pregunto si esto es más rápido que implosionar la matriz. – Capsule

+1

@Capsule para el tamaño de matriz de 6, nunca verás la más mínima diferencia, incluso pasas toda tu vida comprobando las matrices. para los tamaños de más de 1000, sugeriría no usar matrices en absoluto. –

+0

Dado que estamos hablando de sitios web, debe multiplicarlos por su número de visitantes. Un conjunto de 1000 o 100 visitantes que calculan una matriz de 10 es el mismo en términos de costo de CPU. No puede decidir dejar de usar matrices porque su sitio web está ganando popularidad ;-) – Capsule

-3

esto es bastante simple:

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

usted también tiene que cambiar su encapsulación para sus valores de la matriz de comillas dobles.

+0

Él no necesita un número. Solo 1 es suficiente –

+0

¿Qué ?, quería saber si * todos * los elementos están vacíos, no hay un número solo booleano – RobertPitt

+0

Creo que lo que Col. está diciendo groseramente es que en PHP ambos 'count ($ array) == 0' y 'count ($ array)' se evalúan como verdaderos, por lo que los pasos adicionales de comparación y asignación no se oyen por casualidad. Aunque las asignaciones cuestan muy poco en php. – xzyfer

6

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

function isArrayEmpty($array) { 
    foreach($array as $key => $val) { 
     if ($val !== '') 
      return false; 
    } 
    return true; 
} 
+1

'empty()' puede proporcionar resultados falsos positivos. Consulte el manual sobre cómo la función trata los valores 'falsey'. Yo recomendaría la llamada de 'strlen()' en su lugar. – mickmackusa

+0

Gracias por el recordatorio sobre falseyness @mickmackusa, lo he actualizado para comprobar la explicidad de la cadena vacía. – mulquin

-1

tardía respuesta tardía pero probablemente la manera más rápida y mejor manera de hacerlo:

$array = array("demoKey1" => "", "demoKey2" => "2");  

if(count(array_flip($array)) > 1){ 
     // keys not empty 
     // for example count is 2 
} 
+0

Esta respuesta no es correcta y debe eliminarse para evitar confundir/engañar a futuros lectores. Prueba: https://3v4l.org/M1WnB – mickmackusa

Cuestiones relacionadas