Php, in_array, la valeur 0
J'essaye de comprendre le in_array
comportement à le scénario suivant:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
La valeur renvoyée par la in_array()
est un booléen true
. Comme vous pouvez le voir il y a pas valeur égale à 0
, donc si certains ont une, merci de m'aider à comprendre pourquoi le retour de la fonction vrai?
Je vois deux entrées égal à 0 dans ce tableau
Hey Jonathan, Merci pour votre réponse vraiment bon, merci encore et bonne journée.
Hey Jonathan, Merci pour votre réponse vraiment bon, merci encore et bonne journée.
OriginalL'auteur Aviel Fedida | 2012-12-12
Vous devez vous connecter pour publier un commentaire.
C'est un problème connu, par les commentaires dans la documentation. Considérons les exemples suivants:
Pour éviter cela, constituent la troisième paramètre,
true
, en plaçant la comparaison dans la mode strict qui permettra non seulement de comparer des valeurs, mais des types comme:D'autres solutions de rechange existent, qui ne nécessitent pas toutes les cases à être placé dans le strict mode:
Mais Pourquoi?
La raison derrière tout cela est probablement chaîne-nombre de conversions. Si nous tentons d'obtenir un certain nombre de "au Revoir", nous sont donnés
0
, qui est la valeur que nous leur demandons de look-up.Pour confirmer cela, nous pouvons utiliser
array_search
pour trouver la clé qui est associé avec le correspondant valeur:En cela, la clé renvoyée est
2
, sens0
se retrouve dans la conversion deBye
à un entier.0 == 'string'
de VRAIMis à jour.
Ouais, je n'étais pas sûr de savoir pourquoi . . . J'ai posté mes expériences/conclusions dans ma réponse, ainsi que la ligne spécifique sur les chaînes converti à 0, mais merci pour vos éclaircissements.
Beau travail. J'ai pensé que la chose naturelle serait de tirer parti de
array_search
de voir la valeur de PHP est de trouver à être égale à0
, et bien sûr, c'est la première chaîne qui ne commence pas par un nombre.Une chaîne de " 4u " serait converti à 4 après la jonglerie. Mais si le premier caractère n'est pas un nombre, elle sera convertie en 0 à la place. Certainement un plaisir question.
OriginalL'auteur Sampson
Essayez d'ajouter un troisième paramètre
true
(en mode strict) à votrein_array
appel.OriginalL'auteur Madbreaks
C'est à la suite de la lâche comparaison et type de jonglage.
Lâche comparaison signifie que PHP
==
pas===
lorsque l'on compare les éléments.==
ne pas comparer les deux types de variables sont égales, seulement de leur valeur, tandis que les===
permettra de s'assurer qu'ils correspondent au type et de la valeur (par exemple, comparer0 == FALSE
et0 === FALSE
).Donc, fondamentalement, votre in_array fonction est de vérifier:
Noter que les 52 seront perdus en raison de la façon dont vous avez créé votre tableau.
Notez que si vous n':
Vous obtiendrez 1. Apparemment, PHP est type de jonglage les 'au Revoir' à 0, ce qui est la même chose qui va se produire lorsque vous lancez une chaîne de type int, par exemple
(int) 'string'
sera égal à 0. Spécifiques référence de la Chaîne de conversion de numéros de doc (Italiques ajoutés):Apparemment, le type entier est prioritaire sur le type de chaîne (c'est à dire qu'il aurait tout aussi bien pu faire la comparaison par le casting de l'int de 0 à une chaîne, ce qui serait alors retourner Faux). Ceci est indiqué dans le les opérateurs de comparaison doc:
Merci pour une question intéressante qui m'a conduit à faire des recherches et d'apprendre quelque chose de nouveau!
OriginalL'auteur ernie
in_array est censé être utilisé sur des tableaux indexés ([0], [1], [2] etc), pas avec un dictionnaire que vous avez défini (key-value store).
Si vous voulez vérifier si votre tableau $arr comprend '0', essayez d'utiliser la fonction PHP array_key_exists au lieu - http://php.net/manual/en/function.array-key-exists.php.
OriginalL'auteur Niklas9