Est-il possible d'utiliser une chaîne numérique comme "123"
une clé dans un tableau PHP, sans qu'elle soit convertie en entier?
$blah = array('123' => 1);
var_dump($blah);
impressions
array(1) {
[123]=>
int(1)
}
Je voudrais
array(1) {
["123"]=>
int(1)
}
"123"
==123
pour presque tous les usages. Quelle est la raison pour laquelle vous le voulez spécifiquement sous forme de chaîne (et avoir un int est mauvais)?array_merge
"Si les tableaux d'entrée ont les mêmes clés de chaîne, la valeur la plus récente de cette clé écrasera la précédente. Si, cependant, les tableaux contiennent des clés numériques , la valeur la plus récente ne sera pas écraser la valeur d'origine, mais sera ajoutée. "asort
Réponses:
Non; non ce n'est pas:
À partir du manuel :
Addenda
À cause des commentaires ci-dessous, j'ai pensé qu'il serait amusant de souligner que le comportement est similaire mais pas identique aux clés d'objet JavaScript.
la source
Oui, c'est possible en transtypant un
stdClass
objet en tableau :Cela vous donne (jusqu'à la version 7.1 de PHP):
(Mise à jour: Ma réponse originale montrait une manière plus compliquée en utilisant
json_decode()
etjson_encode()
qui n'est pas nécessaire.)Notez le commentaire : Il n'est malheureusement pas possible de référencer directement la valeur:
$data['12']
entraînera un avis.Mise à jour : à
partir de PHP 7.2, il est également possible d'utiliser une chaîne numérique comme clé pour référencer la valeur:
la source
echo $data['12'];
. Il donnera l'erreur, "Avis: Décalage non défini: 12 pouces - sur la ligne 5".array_key_exists
je ne le trouverai pas non plus dans les anciennes versions.Si vous avez besoin d'utiliser une clé numérique dans une structure de données php, un objet fonctionnera. Et les objets préservent l'ordre, vous pouvez donc itérer.
la source
array()
, donc je suppose que dans ce contexte, les chaînes spécifiant des entiers valides seront converties en type entier. Mais il s'avère qu'il existe d'autres façons de créer des tableaux, là où cela ne se produit pas, comme dans la réponse de David, que j'ai testée.Ma solution de contournement est:
L'espace char (prefend) est une bonne solution car gardez la conversion int:
Vous verrez 55 comme int.
la source
"0$id" => $value
. La préparation avec des0
œuvres aussi.Vous pouvez taper la clé en chaîne, mais elle sera finalement convertie en un entier en raison de la saisie lâche de PHP. Voir par vous-même:
Depuis le manuel PHP:
la source
[42 => 'answer', 'snafu' => 'fubar']
J'ai eu ce problème en essayant de fusionner des tableaux qui avaient à la fois des clés de chaîne et des clés entières. Il était important que les entiers soient également traités comme des chaînes car il s'agissait de noms pour les champs de saisie (comme dans les pointures de chaussures, etc.)
Quand j'utilisais
$data = array_merge($data, $extra);
PHP, je réorganisais les clés. Dans une tentative de classement, les clés entières (j'ai essayé avec6
-'6'
-"6"
même en(string)"6"
tant que clés) ont été renommées de 0 àn
... Si vous y réfléchissez, dans la plupart des cas, ce serait le comportement souhaité.Vous pouvez contourner ce problème en utilisant à la
$data = $data + $extra;
place. Assez simple, mais je n'y ai pas pensé au début ^^.la source
FAUX
J'ai une fonction de casting qui gère le casting séquentiel à associatif,
la source
Pour contourner ce problème, vous pouvez encoder un tableau PHP en objet json, avec l'option JSON_FORCE_OBJECT.
ie, cet exemple:
aura pour résultat:
la source
J'ai rencontré ce problème sur un tableau avec à la fois «0» et «» comme clés. Cela signifiait que je ne pouvais pas vérifier mes clés de tableau avec == ou ===.
La solution de contournement consiste à convertir les clés du tableau en chaînes avant utilisation.
la source
En ce qui concerne la solution @david, veuillez noter que lorsque vous essayez d'accéder aux valeurs de chaîne dans le tableau associatif, les nombres ne fonctionneront pas. Je suppose qu'ils sont convertis en nombres entiers dans les coulisses (lors de l'accès au tableau) et qu'aucune valeur n'est trouvée. L'accès aux valeurs sous forme d'entiers ne fonctionnera pas non plus. Mais vous pouvez utiliser array_shift () pour obtenir les valeurs ou parcourir le tableau.
la source
"0"
devient0
avec php7.2.10
.J'ai eu ce problème en essayant de trier un tableau où j'avais besoin que la clé de tri soit un hex sha1. Lorsqu'une valeur sha1 résultante n'a pas de lettres, PHP transforme la clé en un entier. Mais j'avais besoin de trier le tableau dans l'ordre relatif des chaînes. J'avais donc besoin de trouver un moyen de forcer la clé à être une chaîne sans changer l'ordre de tri.
En regardant le graphique ASCII ( https://en.wikipedia.org/wiki/ASCII ), le point d'exclamation est à peu près identique à l'espace et certainement inférieur à tous les chiffres et lettres.
J'ai donc ajouté un point d'exclamation à la fin de la chaîne de clé.
la source