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>';
php
arrays
validation
Mate
fuente
fuente
Respuestas:
Puede usar el array_filter incorporado
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>'; }
fuente
array_filter()
ya fue mencionado por @ dogmatic69. Acerca del rendimiento: creo que lo simpleforeach
debería ser más rápido que ambosarray_filter()
yimplode()
.if(implode($array)) echo '..'
imprimiría '..' incluso si un elemento de la matriz lo fuera(string)"0"
. Acerca deforeach
ser más lento quearray_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?array_filter()
solo para verificar si algún valor está lleno es al menos algunas veces más lento que elforeach
ciclo básico con alguna variable booleana para almacenar el resultado ybreak
el primer valor no válido. Inclusoarray_filter()
siendo una "función PHP nativa", realmente no puede ser más rápidoforeach
ya que tiene que crear una nueva variable de matriz.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'; ?>
fuente
strlen
llamada para que esto sea más eficiente.if(implode($array)) echo '..'
$str
es(string)'0'
, luegostrlen($str) == 0
evalúa afalse
, mientras que!$str
evalúa atrue
, porstrlen($str) == 0
lo tanto no se puede reemplazar con!$str
.array_filter
, porquearray_filter
está 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.array_filter
es 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, usararray_filter
no es menos correcto que esto, es solo un método diferente ;-)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; }
fuente
empty()
puede proporcionar resultados falsos positivos. Consulte el manual sobre cómo la función trata losfalsey
valores. Recomendaría la llamada de en sustrlen()
lugar.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)
fuente
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!';
fuente
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"] );
fuente
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.
fuente
foreach($array as $key => $value)
y pruebe si$value
está vacío o no.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>'; }
fuente
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.
fuente
count($array) == 0
ycount($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.