web-dev-qa-db-fra.com

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

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

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

78
cgwebprojects

Selon le manuel :

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

De plus, les clés suivantes seront lancées:

  • Les chaînes contenant des entiers valides seront converties dans le type entier. Par exemple. la clé "8" sera effectivement stockée sous 8. Par contre, "08" ne sera pas converti, car il ne s'agit pas d'un entier décimal valide.
  • Les flottants sont également convertis en entiers, ce qui signifie que la partie décimale sera tronquée. Par exemple. la clé 8.7 sera effectivement stockée sous 8.
  • Les booléens sont également convertis en entiers, c'est-à-dire que la clé true sera réellement 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 réalité 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, un caractère étant identique à un octet. Cela signifie que PHP ne prend en charge qu'un jeu de 256 caractères et n'offre donc pas de prise en charge native Unicode. Voir les détails du type de chaîne.

En bref, toute chaîne peut être une clé. Et une chaîne peut contenir n’importe quelle donnée binaire (jusqu’à 2 Go). Par conséquent, une clé peut être n'importe quelle donnée binaire (puisqu'un chaîne peut être n'importe quelle donnée binaire).

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

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

La clé doit être une chaîne ou un entier. Certains moulages ont lieu, mais je pense que le manuel explique très bien:

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

De plus, les clés suivantes seront lancées:

  • Les chaînes contenant des entiers valides seront converties dans le type entier. Par exemple. la clé "8" sera effectivement stockée sous 8. De l'autre la main "08" ne sera pas lancée, car ce n'est pas un entier décimal valide.
  • Les flottants sont également convertis en entiers, ce qui signifie que la partie décimale sera tronquée. Par exemple. la clé 8.7 sera effectivement stockée sous 8.
  • Les booléens sont également convertis en entiers, c'est-à-dire que la clé true sera réellement 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 réalité 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.
11
Matthew

J'ai trouvé cette réponse à la recherche de plus d'informations sur un problème que j'ai eu. J'utilisais des chaînes contenant des caractères UTF-8, ce qui ne fonctionnerait pas comme clé 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 le faire ..

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

Tout ce que vous pouvez insérer dans une chaîne PHP peut être utilisé comme clé de tableau. Il n'y a aucune 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
5
Marc B

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 par ailleurs aucune restriction spéciale aux chaînes de clés de tableau. En d'autres termes: tant que c'est une chaîne, tout est permis.

5
deceze

Si les clés complexes provoquent une erreur "index non défini", vous pouvez simplement avoir un problème de "découpage".

J'étais en train de devenir dingue parce qu'une clé complexe crachait l'erreur "d'index non défini" et je pensais que c'était peut-être une violation de syntaxe. La clé du tableau à l'origine de l'erreur a été créée à partir d'un champ issu d'une requête de la base de données MySQL que je convertissais en clé et que j'utilisais dans un nouveau tableau. La clé ressemblait à ceci: pl_1DNKoiJKwotCqAycickBVhTy et 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];

lorsque, en fait, $keyval et $dbquery['fieldname'] semblaient correspondre parfaitement (vérifiés visuellement en renvoyant les deux en écho au navigateur). Le mystère a été résolu en utilisant simplement trim dans la deuxième déclaration comme suit: $keyval = trim($array_two['fieldname']); Une fois "ajusté", php ne se plaint plus.

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

0
globalSchmidt

En plus de toutes les réponses telles qu'elles sont vraies: Vous pouvez utiliser PSR qu'il s'agit d'une sorte de règle entre les meilleurs programmeurs pour avoir un style de code Nice et standard.

0
VeRJiL

Personnellement, je n'ai eu aucun problème avec des 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. 

0
GordonM