players
sera soit vide, soit une liste séparée par des virgules (ou une seule valeur). Quelle est la façon la plus simple de vérifier s'il est vide? Je suppose que je peux le faire dès que je récupère le $gameresult
tableau dans $gamerow
? Dans ce cas, il serait probablement plus efficace de sauter l'explosion $playerlist
s'il est vide, mais pour les besoins de l'argument, comment vérifier si un tableau est également vide?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Réponses:
Si vous avez juste besoin de vérifier s'il y a des éléments dans le tableau
Si vous devez nettoyer les valeurs vides avant de vérifier (généralement pour éviter
explode
les chaînes étranges):la source
empty()
.if(!isset($emptyarray))
estfalse
maisif(empty($emptyarray))
revienttrue
. Cela m'a juste clouéUn tableau vide est falsey en PHP, vous n'avez donc même pas besoin de l'utiliser
empty()
comme d'autres l'ont suggéré.PHP de
empty()
détermine si une variable n'existe pas ou a une valeur de Falsey (commearray()
,0
,null
,false
, etc.).Dans la plupart des cas, vous voulez juste vérifier
!$emptyVar
. À utiliserempty($emptyVar)
si la variable n'a peut-être pas été définie ET que vous n'avez pas l'habitude de déclencher unE_NOTICE
; OMI, c'est généralement une mauvaise idée.la source
Quelques réponses décentes, mais je pensais juste développer un peu pour expliquer plus clairement quand PHP détermine si un tableau est vide.
Notes principales:
Un tableau avec une clé (ou des clés) sera déterminé comme NON vide par PHP.
Comme les valeurs de tableau ont besoin de clés pour exister, avoir ou non des valeurs dans un tableau ne détermine pas s'il est vide, uniquement s'il n'y a pas de clés (ET donc pas de valeurs).
Donc, vérifier un tableau avec
empty()
ne vous dit pas simplement si vous avez des valeurs ou non, il vous dit si le tableau est vide et que les clés font partie d'un tableau.Considérez donc comment vous produisez votre tableau avant de décider quelle méthode de vérification utiliser.
EG Un tableau aura des clés lorsqu'un utilisateur soumet votre formulaire HTML lorsque chaque champ de formulaire a un nom de tableau (c'est-à-dire
name="array[]"
).Un tableau non vide sera produit pour chaque champ car il y aura des valeurs de clé incrémentées automatiquement pour le tableau de chaque champ de formulaire.
Prenez ces tableaux par exemple:
Si vous faites écho aux clés et valeurs de tableau pour les tableaux ci-dessus, vous obtenez ce qui suit:
Et le test des tableaux ci-dessus avec
empty()
renvoie les résultats suivants:Un tableau sera toujours vide lorsque vous affectez un tableau mais ne l'utilisez pas par la suite, comme:
Ce sera vide, c'est-à-dire que PHP retournera TRUE lors de l'utilisation de if
empty()
sur ce qui précède.Donc, si votre tableau a des clés - par exemple par les noms d'entrée d'un formulaire ou si vous les affectez manuellement (c.-à-d. Créez un tableau avec des noms de colonnes de base de données comme clés mais pas de valeurs / données de la base de données), alors le tableau ne le sera PAS
empty()
.Dans ce cas, vous pouvez boucler le tableau dans un foreach, tester si chaque clé a une valeur. C'est une bonne méthode si vous devez quand même parcourir le tableau, peut-être en vérifiant les clés ou en désinfectant les données.
Cependant, ce n'est pas la meilleure méthode si vous avez simplement besoin de savoir "si des valeurs existent" renvoie VRAI ou FAUX . Il existe différentes méthodes pour déterminer si un tableau a des valeurs lorsqu'il sait qu'il aura des clés. Une fonction ou une classe peut être la meilleure approche, mais comme toujours, cela dépend de votre environnement et des exigences exactes, ainsi que d'autres choses telles que ce que vous faites actuellement avec le tableau (le cas échéant).
Voici une approche qui utilise très peu de code pour vérifier si un tableau a des valeurs:
Utilisation
array_filter()
:Itère sur chaque valeur du tableau en les passant à la fonction de rappel. Si la fonction de rappel renvoie true, la valeur actuelle du tableau est renvoyée dans le tableau résultat. Les clés de tableau sont conservées.
L'exécution
array_filter()
sur les trois tableaux d'exemple (créés dans le premier bloc de code de cette réponse) entraîne les résultats suivants:Ainsi, lorsqu'il n'y a pas de valeurs, qu'il y ait des clés ou non, utiliser
array_filter()
pour créer un nouveau tableau, puis vérifier si le nouveau tableau est vide montre s'il y avait des valeurs dans le tableau d'origine.Ce n'est pas idéal et un peu désordonné, mais si vous avez un énorme tableau et n'avez pas besoin de le parcourir pour toute autre raison, alors c'est le plus simple en termes de code nécessaire.
Je n'ai pas l'expérience de la vérification des frais généraux, mais il serait bon de connaître les différences entre l'utilisation
array_filter()
et laforeach
vérification si une valeur est trouvée.De toute évidence, le benchmark devrait être sur divers paramètres, sur de petits et grands tableaux et quand il y a des valeurs et non etc.
la source
array_filter()
count(array())==0
est faux lorsqu'il y a des clés et aucune valeur, donc cela n'aide pas à vérifier les valeurs uniquement. Votre déclaration est correcte, mais vous forcez un test aveccount(array())
car le tableau est bien sûr vide. Nous devons vérifier quand le tableau est revenu d'un formulaire ou d'un autre endroit pour savoir s'il est vide (clés / valeurs) ou s'il a juste des valeurs ou nonarray_filter($_FILES["documento"]['name'])
count($gamerow['players'])
sera 0.la source
Si vous voulez vérifier si la variable que vous testez est en fait explicitement un tableau vide, vous pouvez utiliser quelque chose comme ceci:
la source
Si vous souhaitez exclure les lignes fausses ou vides (telles que
0 => ''
), où l'utilisationempty()
échouera, vous pouvez essayer:Si vous souhaitez supprimer toutes les chaînes NULL, FALSE et vides (
''
), mais laisser des valeurs nulles (0
), vous pouvez les utiliserstrlen
comme rappel, par exemple:la source
Pourquoi personne n'a dit cette réponse:
la source
array()
c'est la même chose.===
place de==
, car elle est plus rapide.is_array
la source
explode()
- il renvoie des données de type tableau. La vérificationempty()
est un appel de fonction inutile. Comme l'a déclaré Cobby en 2012,if($detect)
c'est tout ce qui est nécessaire. Cette solution ne doit pas être implémentée pour cette tâche ou d'autres. Vous pourriez faire valoir que vous couvrez des situations au-delà de la portée de cette question, eh bien, il n'y a jamais besoin d'appelerempty()
APRÈSis_array()
parce que si la variable n'est pas "définie", alorsis_array()
générera "Avis: Variable non définie ", siisset()
alorsempty()
c'est exagéré, utilisez simplement La réponse de Cobby.J'ai couru le benchmark inclus à la fin du post. Pour comparer les méthodes:
count($arr) == 0
: compterempty($arr)
: vide$arr == []
: comp(bool) $arr
: fonteet a obtenu les résultats suivants
La différence entre vide et transtypé en booléen est insignifiante. J'ai exécuté ce test plusieurs fois et ils semblent être essentiellement équivalents. Le contenu des tableaux ne semble pas jouer un rôle significatif. Les deux produisent les résultats opposés, mais la négation logique est à peine suffisante pour pousser le casting à gagner la plupart du temps, donc je préfère personnellement vide pour des raisons de lisibilité dans les deux cas.
la source
sizeof
quel est [pas?] L'alias deempty
... stackoverflow.com/a/51986794/1429432===
au lieu de==
.si vous devez vérifier le contenu du tableau, vous pouvez utiliser:
voir ici: http://codepad.org/EORE4k7v
la source
À mon avis, le moyen le plus simple pour un tableau indexé serait simplement:
Une condition «if» sur le tableau serait évaluée à true si le tableau n'est pas vide et false si le tableau est vide . Cela ne s'applique pas aux tableaux associatifs.
la source
J'utilise ce code
Mais notez que si le tableau a un grand nombre de clés, ce code passera beaucoup de temps à les compter, par rapport aux autres réponses ici.
la source
Vous pouvez utiliser
array_filter()
ce qui fonctionne très bien dans toutes les situations:la source
la source
Je pense que la meilleure façon de déterminer si le tableau est vide ou non est d'utiliser count () comme ceci:
la source
count()
appel peut être entièrement supprimé - voir la réponse de Cobby.Prendre la décision la plus appropriée nécessite de connaître la qualité de vos données et les processus à suivre.
Si vous allez disqualifier / ignorer / supprimer cette ligne, le premier point de filtrage devrait être dans la requête mysql.
WHERE players IS NOT NULL
WHERE players != ''
WHERE COALESCE(players, '') != ''
WHERE players IS NOT NULL AND players != ''
Si vous n'êtes pas sûr à 100% si la colonne existera dans le jeu de résultats, vous devez vérifier que la colonne est déclarée. Cela signifie appeler
array_key_exists()
,isset()
ouempty()
sur la colonne. Je ne vais pas prendre la peine de délimiter les différences ici (il y a d'autres pages SO pour cette ventilation, voici un début: 1 , 2 , 3 ). Cela dit, si vous n'êtes pas en contrôle total de l'ensemble de résultats, alors vous avez peut-être trop de «flexibilité» d'application et devriez repenser si le problème d'accéder potentiellement à des données de colonne inexistantes en vaut la peine. En effet, je dis que vous ne devriez jamais avoir besoin de vérifier si une colonne est déclarée - ergo vous ne devriez jamais avoir besoinempty()
pour cette tâche. Si quelqu'un fait valoir queempty()
est plus approprié, alors ils poussent leur propre opinion personnelle sur l'expressivité des scripts. Si vous trouvez que la condition dans # 5 ci-dessous est ambiguë, ajoutez un commentaire en ligne à votre code - mais je ne le ferais pas. L'essentiel est qu'il n'y a aucun avantage programmatique à effectuer l'appel de fonction.Votre valeur de chaîne peut-elle contenir un
0
que vous souhaitez juger vrai / valide / non vide? Si c'est le cas, il vous suffit de vérifier si la valeur de la colonne a une longueur.Voici une démo utilisant
strlen()
. Cela indiquera si la chaîne créera ou non des éléments de tableau significatifs si elle est éclatée.Je pense qu'il est important de mentionner qu'en explosant sans condition, vous êtes GARANTI de générer un tableau non vide. Voici la preuve: Démo En d'autres termes, vérifier si le tableau est vide est complètement inutile - il sera non vide à chaque fois.
Si votre chaîne ne contiendra PAS POSSIBLEMENT une valeur nulle (parce que, disons, il s'agit d'un csv composé d'ID qui commencent à partir
1
et ne font qu'augmenter), alorsif ($gamerow['players']) {
c'est tout ce dont vous avez besoin - fin de l'histoire.... mais attendez, que faites-vous après avoir déterminé le vide de cette valeur? Si vous avez quelque chose de down-script attendu
$playerlist
, mais que vous déclarez conditionnellement cette variable, vous risquez d'utiliser la valeur de la ligne précédente ou de générer à nouveau des notifications. Alors , avez - vous besoin de déclarer inconditionnellement$playerlist
comme quelque chose ? S'il n'y a pas de valeurs véridiques dans la chaîne, votre application bénéficie-t-elle de la déclaration d'un tableau vide? Les chances sont, la réponse est oui. Dans ce cas, vous pouvez vous assurer que la variable est de type tableau en retombant dans un tableau vide - de cette façon, peu importe si vous introduisez cette variable dans une boucle. Les déclarations conditionnelles suivantes sont toutes équivalentes.$playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];
Pourquoi suis-je allé si loin pour expliquer cette tâche très fondamentale?
la source
la source
$matches = preg_grep ( "/^$text (\w+)/i" , $array ) ;
pour le vérifier J'utiliseif ( count ( $matches ) > 0 )
empty()
fait trop de travail.J'ai résolu ce problème avec le code suivant.
la source
Cela semble fonctionner pour tous les cas
la source