Alcune risposte decenti, ma ho solo pensato di espandermi un po 'per spiegare più chiaramente quando PHP determina se un array è vuoto.
Note principali:
Un array con una chiave (o chiavi) sarà determinato come NON vuoto da PHP.
Poiché i valori dell'array devono esistere chiavi, avere o meno valori in un array non determina se è vuoto, solo se non ci sono chiavi (E quindi non ci sono valori).
Quindi il controllo di un array con empty()
non ti dice semplicemente se hai valori o meno, ti dice se l'array è vuoto e le chiavi fanno parte di un array.
Quindi considera come stai producendo il tuo array prima di decidere quale metodo di controllo usare.
Ad esempio un array avrà le chiavi quando un utente invia il tuo modulo HTML quando ogni campo del modulo ha un nome di array (cioè name="array[]"
).
Un non vuoto array viene prodotta per ogni campo come ci sarà automaticamente incrementato valori chiave per allineamento di ogni campo di modulo.
Prendi questi array per esempio:
/* Assigning some arrays */
// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");
// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";
// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';
Se si riecheggiano le chiavi e i valori dell'array per gli array di cui sopra, si ottiene quanto segue:
ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]
ARRAY TWO:
[0] => [UserValue01]
[1] => [UserValue02]
TRE ARRAY:
[0] => []
[1] => []
E testare le matrici sopra con empty()
restituisce i seguenti risultati:
ARRAY ONE:
$ ArrayOne non è vuoto
ARRAY DUE:
$ ArrayDue non è vuoto
ARRAY TRE:
$ ArrayThree non è vuoto
Un array sarà sempre vuoto quando si assegna un array ma non lo si utilizza in seguito, ad esempio:
$ArrayFour = array();
Questo sarà vuoto, cioè PHP restituirà VERO quando si usa se empty()
sopra.
Quindi, se il tuo array ha chiavi - ad esempio con i nomi di input di un modulo o se le assegni manualmente (cioè crea un array con i nomi delle colonne del database come chiavi ma nessun valore / dato dal database), allora l'array NON lo sarà empty()
.
In questo caso, è possibile eseguire il ciclo dell'array in un foreach, verificando se ogni chiave ha un valore. Questo è un buon metodo se devi comunque eseguire l'array, magari controllando le chiavi o disinfettando i dati.
Tuttavia, non è il metodo migliore se devi semplicemente sapere "se esistono valori" restituisce VERO o FALSO . Esistono vari metodi per determinare se un array ha valori quando sa che avrà le chiavi. Una funzione o classe potrebbe essere l'approccio migliore, ma come sempre dipende dal proprio ambiente e dai requisiti esatti, nonché da altre cose come ciò che si fa attualmente con l'array (se non altro).
Ecco un approccio che utilizza pochissimo codice per verificare se un array ha valori:
Utilizzo array_filter()
:
passa da un valore all'altro dell'array passandoli alla funzione di richiamata. Se la funzione di callback restituisce true, il valore corrente dall'array viene restituito nell'array dei risultati. Le chiavi dell'array vengono conservate.
$EmptyTestArray = array_filter($ArrayOne);
if (!empty($EmptyTestArray))
{
// do some tests on the values in $ArrayOne
}
else
{
// Likely not to need an else,
// but could return message to user "you entered nothing" etc etc
}
L'esecuzione array_filter()
su tutti e tre gli array di esempio (creati nel primo blocco di codice in questa risposta) comporta quanto segue:
ARRAY ONE:
$ arrayone non è vuoto
ARRAY DUE:
$ arraytwo non è vuoto
ARRAY TRE:
$ arraythree è vuoto
Quindi, quando non ci sono valori, che ci siano chiavi o meno, usando array_filter()
per creare un nuovo array e quindi verificare se il nuovo array è vuoto, mostra se c'erano dei valori nell'array originale.
Non è l'ideale e un po 'disordinato, ma se si dispone di un array enorme e non è necessario eseguirne il loop per qualsiasi altro motivo, questo è il più semplice in termini di codice necessario.
Non ho esperienza nel controllo delle spese generali, ma sarebbe utile conoscere le differenze tra l'utilizzo array_filter()
e la foreach
verifica se viene trovato un valore.
Ovviamente il benchmark dovrebbe essere su vari parametri, su array piccoli e grandi e quando ci sono valori e non ecc.