Come verificare se un array è vuoto usando PHP?


471

playerssarà vuoto o un elenco separato da virgole (o un singolo valore). Qual è il modo più semplice per verificare se è vuoto? Suppongo di poterlo fare non appena recupero l' $gameresultarray $gamerow? In questo caso sarebbe probabilmente più efficiente saltare l'esplosione $playerlistse è vuoto, ma per ragioni di argomento, come posso verificare se anche un array è vuoto?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);

2
Non usare count (), sizeof (), empty (). Array vuoto return false: if ($ array) {
Limitrof

Risposte:


774

Se hai solo bisogno di verificare se ci sono QUALSIASI elemento nella matrice

if (empty($playerlist)) {
     // list is empty.
}

Se è necessario ripulire i valori vuoti prima del controllo (generalmente eseguita per evitare explodestringhe strane):

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}

2
Non dovresti semplicemente usare vuoto? il conteggio richiederà più tempo per l'esecuzione di array di grandi dimensioni.
Dan McGrath,

1
Fatto. L'ho anche cambiato per il fatto che non devi usare isset e roba del genere.
Tyler Carter,

5
Dato il suo esempio di codice, la variabile verrà impostata in modo che non sia necessario utilizzarla empty().
Cobby,

4
! ATTENZIONE if(!isset($emptyarray))è falsema if(empty($emptyarray))ritorna true. Mi ha appena inchiodato
Kolob Canyon,

161

Un array vuoto è falso in PHP, quindi non è nemmeno necessario usarlo empty()come altri hanno suggerito.

<?php
$playerList = array();
if (!$playerList) {
    echo "No players";
} else {
    echo "Explode stuff...";
}
// Output is: No players

PHP di empty()determina se una variabile non esiste o ha un valore falsey (come array(), 0, null, false, ecc).

Nella maggior parte dei casi vuoi solo controllare !$emptyVar. Utilizzare empty($emptyVar)se la variabile potrebbe non essere stata impostata E non si desidera attivare un E_NOTICE; IMO questa è generalmente una cattiva idea.


2
Spero che questo non cambi in alcuni standard ... sarà doloroso
David Constantine,

79

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


2
Grazie mille per questo. È stato davvero istruttivo ed è stato in grado di risolvere il mio problema utilizzandoarray_filter()
Brian Powell,

empty (array ()) valuterà sempre su FALSE, quindi l'aggiunta di count (array ()) == 0 produrrà true
timmz

1
@mboullouz count(array())==0è falso quando ci sono chiavi e nessun valore, quindi questo non aiuta a controllare solo i valori. La tua affermazione è corretta, ma stai forzando un test count(array())poiché l'array è ovviamente vuoto. Dobbiamo verificare quando l'array è tornato da un modulo o da qualche altra parte per sapere se è vuoto (chiavi / valori) o ha solo valori o no
James,

Questa soluzione è perfetta per questo tipo di array, ad esempio aiuta quando si desidera convalidare un file di input array_filter($_FILES["documento"]['name'])
Gendrith


12

Se si desidera accertare se la variabile che si sta testando è effettivamente un array vuoto, è possibile utilizzare qualcosa del genere:

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}

11

Se desideri escludere le righe false o vuote (come 0 => ''), in cui l'utilizzo empty()non riuscirà, puoi provare:

if (array_filter($playerlist) == []) {
  // Array is empty!
}

array_filter(): Se non viene fornito alcun callback, tutte le voci dell'array pari a FALSE (vedere la conversione in booleano) verranno rimosse.

Se desideri rimuovere tutte le stringhe NULL, FALSE e vuote ( ''), ma lasciando valori zero ( 0), puoi utilizzare strlencome richiamata, ad esempio:

$is_empty = array_filter($playerlist, 'strlen') == [];

Questa è la risposta corretta a una domanda diversa. L'uso del filtro array distruggerà gli elementi esistenti con valori di falso. Questo non è ciò che l'OP chiede.
Mickmackusa,

8

Perché nessuno ha detto questa risposta:

$array = [];

if($array == []) {
    // array is empty
}

1
La tua affermazione non è corretta. Qualcuno ha detto questa risposta - Tim Ogilvy - un anno prima. L'uso di parentesi quadre anziché array()è la stessa cosa.
Mickmackusa,

Mentre sotto il cofano è la stessa risposta ... tecnicamente. Ho usato le parentesi quadre anziché la funzione di matrice obsoleta.
Rob

Se usi questo approch, dovresti anche usare ===invece di ==, poiché è più veloce.
Ricordando

7
is_array($detect) && empty($detect);

is_array


Questi sono controlli non necessari. L'OP sta chiamando explode(): restituisce dati di tipo array. Il controllo empty()è una chiamata di funzione non necessaria. Come affermato da Cobby nel 2012, if($detect)è tutto ciò che è richiesto. Questa soluzione non deve essere implementata per questa o altre attività. Potresti sostenere che stai coprendo situazioni al di fuori dell'ambito di questa domanda, beh, non è mai necessario chiamare empty()DOPO is_array()perché se la variabile non è "impostata", allora is_array()genererà "Avviso: variabile non definita ", se isset()poi empty()è eccessiva, basta usare La risposta di Cobby.
Mickmackusa,

6

Ho eseguito il benchmark incluso alla fine del post. Per confrontare i metodi:

  • count($arr) == 0 : contare
  • empty($arr) : vuoto
  • $arr == [] : comp
  • (bool) $arr : cast

e ho ottenuto i seguenti risultati

Contents  \method |    count     |    empty     |     comp     |     cast     |
------------------|--------------|--------------|--------------|--------------|
            Empty |/* 1.213138 */|/* 1.070011 */|/* 1.628529 */|   1.051795   |
          Uniform |/* 1.206680 */|   1.047339   |/* 1.498836 */|/* 1.052737 */|
          Integer |/* 1.209668 */|/* 1.079858 */|/* 1.486134 */|   1.051138   |
           String |/* 1.242137 */|   1.049148   |/* 1.630259 */|/* 1.056610 */|
            Mixed |/* 1.229072 */|/* 1.068569 */|/* 1.473339 */|   1.064111   |
      Associative |/* 1.206311 */|   1.053642   |/* 1.480637 */|/* 1.137740 */|
------------------|--------------|--------------|--------------|--------------|
            Total |/* 7.307005 */|   6.368568   |/* 9.197733 */|/* 6.414131 */|

La differenza tra vuoto e casting in un booleano è insignificante. Ho eseguito questo test più volte e sembrano sostanzialmente equivalenti. Il contenuto degli array non sembra svolgere un ruolo significativo. I due producono risultati opposti, ma la negazione logica è a malapena sufficiente a spingere il casting a vincere la maggior parte del tempo, quindi preferisco personalmente svuotare per motivi di leggibilità in entrambi i casi.

#!/usr/bin/php
<?php

//    012345678
$nt = 90000000;

$arr0 = [];
$arr1 = [];
$arr2 = [];
$arr3 = [];
$arr4 = [];
$arr5 = [];

for ($i = 0; $i < 500000; $i++) {
    $arr1[] = 0;
    $arr2[] = $i;
    $arr3[] = md5($i);
    $arr4[] = $i % 2 ? $i : md5($i);
    $arr5[md5($i)] = $i;
}

$t00 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr0) == 0;
}
$t01 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr0);
}
$t02 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr0 == [];
}
$t03 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr0;
}
$t04 = microtime(true);

$t10 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr1) == 0;
}
$t11 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr1);
}
$t12 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr1 == [];
}
$t13 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr1;
}
$t14 = microtime(true);

/* ------------------------------ */

$t20 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr2) == 0;
}
$t21 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr2);
}
$t22 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr2 == [];
}
$t23 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr2;
}
$t24 = microtime(true);

/* ------------------------------ */

$t30 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr3) == 0;
}
$t31 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr3);
}
$t32 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr3 == [];
}
$t33 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr3;
}
$t34 = microtime(true);

/* ------------------------------ */

$t40 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr4) == 0;
}
$t41 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr4);
}
$t42 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr4 == [];
}
$t43 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr4;
}
$t44 = microtime(true);

/* ----------------------------------- */

$t50 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr5) == 0;
}
$t51 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr5);
}
$t52 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr5 == [];
}
$t53 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr5;
}
$t54 = microtime(true);

/* ----------------------------------- */

$t60 = $t00 + $t10 + $t20 + $t30 + $t40 + $t50;
$t61 = $t01 + $t11 + $t21 + $t31 + $t41 + $t51;
$t62 = $t02 + $t12 + $t22 + $t32 + $t42 + $t52;
$t63 = $t03 + $t13 + $t23 + $t33 + $t43 + $t53;
$t64 = $t04 + $t14 + $t24 + $t34 + $t44 + $t54;

/* ----------------------------------- */

$ts0[1] = number_format(round($t01 - $t00, 6), 6);
$ts0[2] = number_format(round($t02 - $t01, 6), 6);
$ts0[3] = number_format(round($t03 - $t02, 6), 6);
$ts0[4] = number_format(round($t04 - $t03, 6), 6);

$min_idx = array_keys($ts0, min($ts0))[0];
foreach ($ts0 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts0[$idx] = "   $val   ";
    } else {
        $ts0[$idx] = "/* $val */";
    }

}

$ts1[1] = number_format(round($t11 - $t10, 6), 6);
$ts1[2] = number_format(round($t12 - $t11, 6), 6);
$ts1[3] = number_format(round($t13 - $t12, 6), 6);
$ts1[4] = number_format(round($t14 - $t13, 6), 6);

$min_idx = array_keys($ts1, min($ts1))[0];
foreach ($ts1 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts1[$idx] = "   $val   ";
    } else {
        $ts1[$idx] = "/* $val */";
    }

}

$ts2[1] = number_format(round($t21 - $t20, 6), 6);
$ts2[2] = number_format(round($t22 - $t21, 6), 6);
$ts2[3] = number_format(round($t23 - $t22, 6), 6);
$ts2[4] = number_format(round($t24 - $t23, 6), 6);

$min_idx = array_keys($ts2, min($ts2))[0];
foreach ($ts2 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts2[$idx] = "   $val   ";
    } else {
        $ts2[$idx] = "/* $val */";
    }

}

$ts3[1] = number_format(round($t31 - $t30, 6), 6);
$ts3[2] = number_format(round($t32 - $t31, 6), 6);
$ts3[3] = number_format(round($t33 - $t32, 6), 6);
$ts3[4] = number_format(round($t34 - $t33, 6), 6);

$min_idx = array_keys($ts3, min($ts3))[0];
foreach ($ts3 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts3[$idx] = "   $val   ";
    } else {
        $ts3[$idx] = "/* $val */";
    }

}

$ts4[1] = number_format(round($t41 - $t40, 6), 6);
$ts4[2] = number_format(round($t42 - $t41, 6), 6);
$ts4[3] = number_format(round($t43 - $t42, 6), 6);
$ts4[4] = number_format(round($t44 - $t43, 6), 6);

$min_idx = array_keys($ts4, min($ts4))[0];
foreach ($ts4 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts4[$idx] = "   $val   ";
    } else {
        $ts4[$idx] = "/* $val */";
    }

}

$ts5[1] = number_format(round($t51 - $t50, 6), 6);
$ts5[2] = number_format(round($t52 - $t51, 6), 6);
$ts5[3] = number_format(round($t53 - $t52, 6), 6);
$ts5[4] = number_format(round($t54 - $t53, 6), 6);

$min_idx = array_keys($ts5, min($ts5))[0];
foreach ($ts5 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts5[$idx] = "   $val   ";
    } else {
        $ts5[$idx] = "/* $val */";
    }

}

$ts6[1] = number_format(round($t61 - $t60, 6), 6);
$ts6[2] = number_format(round($t62 - $t61, 6), 6);
$ts6[3] = number_format(round($t63 - $t62, 6), 6);
$ts6[4] = number_format(round($t64 - $t63, 6), 6);

$min_idx = array_keys($ts6, min($ts6))[0];
foreach ($ts6 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts6[$idx] = "   $val   ";
    } else {
        $ts6[$idx] = "/* $val */";
    }

}

echo "             |    count     |    empty     |     comp     |     cast     |\n";
echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Empty |";
echo $ts0[1] . '|';
echo $ts0[2] . '|';
echo $ts0[3] . '|';
echo $ts0[4] . "|\n";

echo "     Uniform |";
echo $ts1[1] . '|';
echo $ts1[2] . '|';
echo $ts1[3] . '|';
echo $ts1[4] . "|\n";

echo "     Integer |";
echo $ts2[1] . '|';
echo $ts2[2] . '|';
echo $ts2[3] . '|';
echo $ts2[4] . "|\n";

echo "      String |";
echo $ts3[1] . '|';
echo $ts3[2] . '|';
echo $ts3[3] . '|';
echo $ts3[4] . "|\n";

echo "       Mixed |";
echo $ts4[1] . '|';
echo $ts4[2] . '|';
echo $ts4[3] . '|';
echo $ts4[4] . "|\n";

echo " Associative |";
echo $ts5[1] . '|';
echo $ts5[2] . '|';
echo $ts5[3] . '|';
echo $ts5[4] . "|\n";

echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Total |";
echo $ts6[1] . '|';
echo $ts6[2] . '|';
echo $ts6[3] . '|';
echo $ts6[4] . "|\n";

Buon punto di riferimento, ma si è dimenticato sizeofche è alias di [no?] empty... stackoverflow.com/a/51986794/1429432
Yousha Aleayoub

FYI: Quando ho eseguito questo benchmark utilizzando PHP 7.4, ho ottenuto risultati diversi che indicavano che il confronto era il più veloce.
Nick Merrill

Dovresti davvero usare ===invece di ==.
Ricordando

5

se si desidera verificare il contenuto dell'array è possibile utilizzare:

$arr = array();

if(!empty($arr)){
  echo "not empty";
}
else 
{
  echo "empty";
}

vedi qui: http://codepad.org/EORE4k7v


Come mostrato da Cobby nel 2012, non è necessario chiamare una funzione per verificare se un array dichiarato è vuoto o meno.
Mickmackusa,

5

Secondo me il modo più semplice per un array indicizzato sarebbe semplicemente:

    if ($array) {
      //Array is not empty...  
    }

Una condizione 'if' sull'array viene valutata come vera se l'array non è vuoto e false se l'array è vuoto . Questo non è applicabile agli array associativi.


Cobby ha effettivamente dichiarato questa tecnica nel 2012. La sua risposta attualmente ha 133 voti positivi.
Mickmackusa,

Questo non è "più semplice" come una questione di opinione - è più semplice perché non esiste una sintassi che può essere più concisa e questo non ha un sovraccarico di chiamata di funzione. Non vi è assolutamente alcuna differenza nell'accesso a un array con chiavi indicizzate rispetto a chiavi associative. Questa risposta è ricercatori fuorvianti. Questa risposta è ridondante , quindi non corretta . 3v4l.org/DSLha
mickmackusa,

3

Io uso questo codice

$variable = array();

if( count( $variable ) == 0 )
{
    echo "Array is Empty";
}
else
{
    echo "Array is not Empty";
}

Ma nota che se l'array ha un gran numero di chiavi, questo codice impiegherà molto tempo a contarle, rispetto alle altre risposte qui.


Come mostrato da Cobby nel 2012, non è necessario chiamare una funzione per verificare se un array dichiarato è vuoto o meno.
Mickmackusa,

3

Puoi usare quello array_filter()che funziona alla grande in tutte le situazioni:

$ray_state = array_filter($myarray);

if (empty($ray_state)) {
    echo 'array is empty';
} else {
    echo 'array is not empty';
}

1
Questa risposta sta impiegando controlli non necessari. Prima di tutto, l'OP non è interessato a filtrare i valori di falsità dall'array prima di verificarne il vuoto, quindi si è discostati dalla domanda pubblicata. In secondo luogo, come mostrato da Cobby nel 2012, non è necessario chiamare una funzione per verificare se un array dichiarato è vuoto o meno.
Mickmackusa,

2
 $gamerow = mysql_fetch_array($gameresult);

if (!empty(($gamerow['players'])) {
   $playerlist = explode(",", $gamerow['players']);
}else{

  // do stuf if array is empty
}

2

Penso che il modo migliore per determinare se l'array è vuoto o meno sia usare count () in questo modo:

if(count($array)) {
    return 'anything true goes here';
}else {
    return 'anything false'; 
}

La count()chiamata può essere completamente rimossa - vedi la risposta di Cobby.
Mickmackusa,

2

Prendere la decisione più appropriata richiede conoscere la qualità dei dati e quali processi devono seguire.

  1. Se stai per squalificare / ignorare / rimuovere questa riga, il primo punto di filtraggio dovrebbe essere nella query mysql.

    • WHERE players IS NOT NULL
    • WHERE players != ''
    • WHERE COALESCE(players, '') != ''
    • WHERE players IS NOT NULL AND players != ''
    • ... dipende dai dati del tuo negozio e ci saranno altri modi, mi fermerò qui.
  2. Se non si è sicuri al 100% se la colonna esisterà nel set di risultati, è necessario verificare che la colonna sia dichiarata. Questo significherà chiamare array_key_exists(), isset()o empty()sulla colonna. Non mi preoccuperò di delineare le differenze qui (ci sono altre pagine SO per quella suddivisione, ecco un inizio: 1 , 2 , 3 ). Detto questo, se non hai il controllo totale del set di risultati, forse hai una "flessibilità" eccessiva nell'applicazione e dovresti ripensare se vale la pena di accedere ai dati di colonne inesistenti. In effetti, sto dicendo che non dovresti mai aver bisogno di verificare se viene dichiarata una colonna - ergo non dovresti mai aver bisogno empty()di questo compito. Se qualcuno lo sta discutendoempty()è più appropriato, quindi stanno spingendo la propria opinione personale sull'espressività dello scripting. Se trovi la condizione nella # 5 in basso come ambigua, aggiungi un commento in linea al tuo codice, ma non lo farei. La linea di fondo è che non vi è alcun vantaggio a livello di programmazione per effettuare la chiamata di funzione.

  3. Il valore della stringa potrebbe contenere un valore 0che desideri ritenere vero / valido / non vuoto? In tal caso, devi solo verificare se il valore della colonna ha lunghezza.

    Ecco una demo usando strlen(). Questo indicherà se la stringa creerà o meno elementi array significativi se esplosa.

  4. Penso che sia importante menzionare che esplodendo incondizionatamente, sei GARANTITO di generare un array non vuoto. Ecco la prova: Demo In altre parole, verificare se l'array è vuoto è completamente inutile: sarà sempre non vuoto.

  5. Se la tua stringa NON contiene POSSIBILMENTE un valore zero (perché, diciamo, questo è un csv costituito da ID che iniziano 1e incrementano solo), allora if ($gamerow['players']) {è tutto ciò che serve - fine della storia.

  6. ... ma aspetta, cosa stai facendo dopo aver determinato il vuoto di questo valore? Se hai qualcosa di down-script che ti aspetti $playerlist, ma stai dichiarando la variabile in modo condizionale, rischi di utilizzare il valore della riga precedente o di generare di nuovo Avvisi. Quindi devi dichiarare incondizionatamente $playerlistcome qualcosa ? Se non ci sono valori di verità nella stringa, l'applicazione trae vantaggio dalla dichiarazione di un array vuoto? Le probabilità sono, la risposta è sì. In questo caso, puoi assicurarti che la variabile sia di tipo array tornando a un array vuoto, in questo modo non importa se inserisci quella variabile in un ciclo. Le seguenti dichiarazioni condizionali sono tutte equivalenti.

    • `if ($ gamerow ['players']) {$ playerlist = explode (',', $ gamerow ['players']); } else {$ playerlist = []; }
    • $playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];

Perché sono andato così tanto a spiegare questo compito basilare?

  1. Ho denunciato quasi tutte le risposte su questa pagina e questa risposta probabilmente attirerà voti di vendetta (ciò accade spesso agli informatori che difendono questo sito - se una risposta ha voti negativi e nessun commento, sii sempre scettico).
  2. Penso che sia importante che Stackoverflow sia una risorsa affidabile che non avvelena i ricercatori con disinformazione e tecniche non ottimali.
  3. Questo è il modo in cui mostro quanto mi importa dei futuri sviluppatori in modo che imparino come e perché invece di alimentare una generazione di programmatori copia-incolla.
  4. Uso spesso vecchie pagine per chiudere nuove pagine duplicate - questa è la responsabilità dei volontari veterani che sanno come trovare rapidamente i duplicati. Non riesco a utilizzare una vecchia pagina con informazioni errate / false / subottimali / fuorvianti come riferimento perché quindi sto attivamente facendo un disservizio a un nuovo ricercatore.

@ptr è qui.
Mickmackusa,

1
empty($gamerow['players'])

alcune volte non si poteva conoscere il valore fondamentale elemento di un array $matches = preg_grep ( "/^$text (\w+)/i" , $array ) ; di check it out io usoif ( count ( $matches ) > 0 )
Salem

Si presume che la colonna esista nel set di risultati, quindi empty()sta facendo troppo lavoro.
Mickmackusa,

-1

Ho risolto questo problema con il seguente codice.

$catArray=array();                          

$catIds=explode(',',$member['cat_id']);
if(!empty($catIds[0])){
foreach($catIds as $cat_id){
$catDetail=$this->Front_Category->get_category_detail($cat_id);
$catArray[]=$catDetail['allData']['cat_title'];
}
echo implode(',',$catArray);
}

1
Benvenuto in Stack Overflow! Grazie per lo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine descrivendo perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Modifica la tua risposta per aggiungere alcune spiegazioni, inclusi i presupposti che hai formulato.
sepehr,

-3

Questo sembra funzionare per tutti i casi

if(!empty(sizeof($array)))

3
Questo ha troppe spese generali. Questa soluzione non deve essere implementata da nessuno sviluppatore per nessun motivo.
Mickmackusa,

@mickmackusa Ottimo punto, ma in che modo un principiante impara a identificare quali operazioni comportano un sovraccarico eccessivo? Qual è l'omaggio o quali sono i criteri del valore nominale per un overhead eccessivo senza eseguire test delle prestazioni?
ptrcao,

1
@ptr c'è un "costo" per ogni chiamata di funzione. Se un'attività può essere completata senza una chiamata di funzione, supererà una tecnica che utilizza una chiamata di funzione.
Mickmackusa,

@ptr Ho pubblicato una risposta esauriente a questa domanda. Spero che chiarisca tutte le preoccupazioni che hai su questa particolare pagina.
Mickmackusa,

@mickmackusa Intendevi includere un link ad un altro post?
ptrcao,

-4

Che ne dite di:

DepartmentPerSchool = array ();
(vuoto (is_array ($ DepartmentPerSchool)))? $ DepartmentPerSchool // o echo non è vuoto: array ('not set' => 'Not set. Contact Admin'); // o echo è vuoto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.