Caractères autorisés dans les clés de tableau php?


86

J'ai des clés de tableau php qui sont remplies de beaucoup de caractères étranges.

Est-ce permis? Y a-t-il des contraintes à ce que je ne peux pas utiliser?


Contraintes:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue le

Réponses:


90

Selon le manuel :

La clé peut être un entier ou une chaîne. La valeur peut être de n'importe quel type.

En outre, les conversions de clés suivantes se produiront:

  • Les chaînes contenant des entiers valides seront converties en type entier. Par exemple, la clé "8" sera en fait stockée sous 8. Par contre "08" ne sera pas converti, car ce n'est pas un entier décimal valide.
  • Les flottants sont également convertis en nombres entiers, ce qui signifie que la partie fractionnaire sera tronquée. Par exemple, la clé 8.7 sera en fait stockée sous 8.
  • Les booléens sont également convertis en entiers, c'est-à-dire que la clé true sera en fait stockée sous 1 et la clé false sous 0.
  • Null sera converti en chaîne vide, c'est-à-dire que la clé null sera en fait stockée sous "".
  • Les tableaux et les objets ne peuvent pas être utilisés comme clés. Cela entraînera un avertissement: Type de décalage illégal.

Le manuel encore :

Une chaîne est une série de caractères, où un caractère est identique à un octet. Cela signifie que PHP ne prend en charge qu'un jeu de 256 caractères et n'offre donc pas de support Unicode natif. Voir les détails du type de chaîne.

Donc, en bref, n'importe quelle chaîne peut être une clé. Et une chaîne peut contenir toutes les données binaires (jusqu'à 2 Go). Par conséquent, une clé peut être n'importe quelle donnée binaire (puisqu'une chaîne peut être n'importe quelle donnée binaire).

Quelques abus aléatoires (valides) des clés de tableau:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
Pour clarifier, cela ne signifie pas que vous ne pouvez pas utiliser des chaînes Unicode comme clés de tableau. En fait, toute chaîne binaire fonctionne très bien. Je trouve le manque de support Unicode auto-décrit de PHP ennuyeux, car ce n'est pas vraiment vrai. :)
deceze

1
@deceze Unicode relève de la catégorie "toute donnée binaire" :) (bien que je suppose qu'avec le libellé du manuel, je suppose que des éclaircissements sont nécessaires). Et dire "n'offre pas de support natif Unicode" est assez vrai. Le noyau PHP n'inclut pas les versions Unicode de strlen, substr, etc. Bien que "n'offre pas de traitement natif des chaînes Unicode" pourrait être plus approprié.
Corbin

3
Bien sûr, le noyau ne contient aucune fonctionnalité permettant de manipuler les chaînes Unicode. Mais tant que vous ne voulez pas manipuler des chaînes, PHP les supporte très bien. Et de façon réaliste, l'extension MB est disponible sur pratiquement toutes les installations PHP par défaut, donc la distinction entre «support de base» ou non est principalement académique. :)
deceze

1
@deceze peut-être que leur note devrait se lire "pas nativement (voir l'extension mb)" ou quelque chose alors. Vous avez raison cependant. Toute installation PHP depuis 2005 prend essentiellement en charge Unicode, même si je dirais que le support d'Unicode en PHP (avec des extensions) est encore un peu désagréable.
Corbin

@Corbin, pourquoi appelez-vous cela abus au lieu d' utilisation ?
Pacerier

12

La clé doit être une chaîne ou un entier. Il y a quelques moulages qui ont lieu, mais je pense que le manuel explique bien:

La clé peut être un entier ou une chaîne. La valeur peut être de n'importe quel type.

En outre, les conversions de clés suivantes se produiront:

  • Les chaînes contenant des entiers valides seront converties en type entier. Par exemple, la clé "8" sera en fait stockée sous 8. Par contre "08" ne sera pas converti, car ce n'est pas un entier décimal valide.
  • Les flottants sont également convertis en nombres entiers, ce qui signifie que la partie fractionnaire sera tronquée. Par exemple, la clé 8.7 sera en fait stockée sous 8.
  • Les booléens sont également convertis en entiers, c'est-à-dire que la clé true sera en fait stockée sous 1 et la clé false sous 0.
  • Null sera converti en chaîne vide, c'est-à-dire que la clé null sera en fait stockée sous "".
  • Les tableaux et les objets ne peuvent pas être utilisés comme clés. Cela entraînera un avertissement: Type de décalage illégal.

Les types de ressources peuvent être convertis en nombre entier maintenant (je ne sais pas s'il s'agit d'une nouvelle fonctionnalité), vous pouvez donc utiliser par exemple un descripteur de fichier ou un descripteur curl comme clé indirectement en le convertissant en entier et en l'utilisant comme clé.
thomasrutter

10

J'ai trouvé cette réponse à la recherche de plus d'informations sur un problème que j'avais. J'utilisais des chaînes avec des caractères UTF-8, qui ne fonctionneraient pas comme des clés d'un tableau que j'avais.

Quelque chose comme

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

La solution (ni grande ni intelligente) pour moi était de faire cela.

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
J'aime md5 () pour générer des clés de tableau. Même si ce n'est pas entièrement nécessaire à ce stade, il semble toujours plus sûr.
billynoah

1
md5 () est parfait pour générer une clé en texte brut à partir de n'importe quelle chaîne. La sécurité n’est pas le problème. Il est également bon que ce soit rapide. Le seul problème est de savoir s'ils décident de le désapprouver, puis de l'éliminer, car il n'est plus bon pour ce qu'il a été conçu à l'origine. Nous verrons.
Patanjali

2
Utilisiez-vous une ancienne version de PHP? Votre premier exemple fonctionne bien dans PHP 7.1.
Elliot B.

6

Les clés de tableau PHP peuvent être des entiers ou des chaînes. Les chaînes PHP sont des tableaux d'octets, c'est-à-dire des séquences d'octets. Il n'y a pas d'autres types de chaînes et PHP n'impose aucune restriction spéciale sur les chaînes de clés de tableau. En d'autres termes: tant que c'est une chaîne, tout est permis.


Je pense que la conversion implicite d'une chaîne en une clé entière est une distinction importante à faire, car certaines fonctions fonctionnent différemment si la clé est un entier ou non. Par exemple, vous pouvez utiliser des numéros de chaîne arbitraires uniquement pour constater qu'une fonction de tableau les réindexe plus tard à partir de 0..n-1.
Matthieu

1
D'accord, mais je pense que c'est à la limite de la portée de cette question. :)
deceze

5

Tout ce que vous pouvez insérer dans une chaîne PHP peut être utilisé comme clé de tableau. Il n'y a pas de limite sur les caractères autorisés.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

Si des clés complexes provoquent une erreur "d'index non défini", il se peut que vous ayez simplement un problème de "trim".

Je devenais fou parce qu'une clé complexe crachait l'erreur "index indéfini" et je pensais que c'était peut-être une violation de syntaxe. La clé de tableau à l'origine de l'erreur a été construite à partir d'un champ d'une requête de base de données MySQL que je convertissais en clé et que j'utilisais dans un nouveau tableau. La clé ressemblait à ceci: pl_1DNKoiJKwotCqAycickBVhTyet voici comment le code a été construit.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

quand, en fait, le $keyvalet $dbquery['fieldname']semblait être une correspondance parfaite (vérifiée visuellement en faisant écho à la fois au navigateur). Le mystère a été résolu en utilisant simplement trimdans la deuxième déclaration comme ceci: $keyval = trim($array_two['fieldname']);Une fois «coupé», php ne se plaignait plus.

En espérant que cela sauve d'autres de certains moments frustrants ...


0

Personnellement, je n'ai eu aucun problème avec les caractères inhabituels dans les clés de tableau. Ce qui est et n'est pas légal n'est pas bien documenté, sauf pour dire que la clé doit être un scalaire. Votre meilleur pari est d'essayer et de voir.


Un peu incohérent, oui, mais c'est bien documenté.
Corbin

0

En plus de toutes les réponses car elles sont vraies: vous pouvez utiliser les PSR qui sont une sorte de règles entre les meilleurs programmeurs pour avoir un style de codage agréable et standard.


0

Dans le tableau php, vous ne pouvez pas utiliser la clé: 2.3 ou les nombres décimaux


-1

Encoder la page php en ANSI "é" pourra être utilisée (Cinéma n'apparaîtra pas comme Cinéma). Dans Notepad ++, utilisez simplement le menu Encode => Convert ANSI et enregistrez


2
(Ce message ne semble pas fournir une réponse de qualité à la question. Veuillez modifier votre réponse ou simplement la publier en tant que commentaire sur la question).
sɐunıɔ ןɐ qɐp

Pouvez-vous expliquer cela davantage? Et si én'est pas présent, que faire si l'OP n'utilise pas Notepad ++ après tout?
Nico Haase
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.