¿Caracteres permitidos en claves de matriz php?


86

Tengo algunas claves de matriz php que están pobladas con muchos caracteres extraños.

Esta permitido? ¿Existe alguna restricción para lo que no puedo usar?


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

Respuestas:


90

Según el manual :

La clave puede ser un número entero o una cadena. El valor puede ser de cualquier tipo.

Además, se producirán los siguientes cambios de clave:

  • Las cadenas que contienen enteros válidos se convertirán al tipo de entero. Por ejemplo, la clave "8" se almacenará en realidad en 8. Por otro lado, "08" no se convertirá, ya que no es un entero decimal válido.
  • Los flotantes también se convierten en números enteros, lo que significa que la parte fraccionaria se truncará. Por ejemplo, la clave 8.7 se almacenará en realidad en 8.
  • Los bools también se convierten en números enteros, es decir, la clave verdadera se almacenará en 1 y la clave falsa en 0.
  • Null se convertirá en la cadena vacía, es decir, la clave nula se almacenará en "".
  • Las matrices y los objetos no se pueden utilizar como claves. Hacerlo resultará en una advertencia: Tipo de compensación ilegal.

El manual de nuevo :

Una cadena es una serie de caracteres, donde un carácter es lo mismo que un byte. Esto significa que PHP solo admite un conjunto de 256 caracteres y, por lo tanto, no ofrece soporte nativo Unicode. Consulte los detalles del tipo de cadena.

Entonces, en resumen, cualquier cadena puede ser una clave. Y una cadena puede contener cualquier dato binario (hasta 2 GB). Por lo tanto, una clave puede ser cualquier dato binario (ya que una cadena puede ser cualquier dato binario).

Algún abuso aleatorio (válido) de claves de matriz:

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

1
Para aclarar, eso no significa que no pueda usar cadenas Unicode como claves de matriz. De hecho, cualquier cadena binaria funciona bien. Encuentro molesta la autodenominada falta de soporte Unicode de PHP, ya que no es realmente cierto. :)
diciembre

1
@deceze Unicode cae en la categoría de "cualquier dato binario" :) (aunque supongo que con la redacción del manual, supongo que es necesaria una aclaración). Y decir "no ofrece soporte nativo Unicode" es bastante cierto. El núcleo de PHP no incluye versiones Unicode de strlen, substr, etc. Aunque "no ofrece procesamiento nativo de cadenas Unicode" podría ser más apropiado.
Corbin

3
Claro, el núcleo no contiene ninguna función para manipular cadenas Unicode. Pero siempre que no desee manipular cadenas, PHP las admite perfectamente. Y hablando de manera realista, la extensión MB está disponible en prácticamente todas las instalaciones de PHP de forma predeterminada, por lo que la distinción entre "soporte básico" o no es principalmente académica. :)
deceze

1
@deceze tal vez su nota debería leer "no de forma nativa (ver extensión mb)" o algo así. Aunque tienes razón. Cualquier instalación de PHP desde 2005 es esencialmente compatible con Unicode, aunque yo diría que el soporte de Unicode en PHP (con extensiones) sigue siendo un poco desagradable.
Corbin

@Corbin, ¿por qué llamas a eso abuso en lugar de uso ?
Pacerier

12

La clave debe ser una cadena o un número entero. Hay algunos lanzamientos que se llevan a cabo, pero creo que el manual hace un buen trabajo al explicar:

La clave puede ser un número entero o una cadena. El valor puede ser de cualquier tipo.

Además, se producirán los siguientes cambios de clave:

  • Las cadenas que contienen enteros válidos se convertirán al tipo de entero. Por ejemplo, la clave "8" se almacenará en realidad en 8. Por otro lado, "08" no se convertirá, ya que no es un entero decimal válido.
  • Los flotantes también se convierten en números enteros, lo que significa que la parte fraccionaria se truncará. Por ejemplo, la clave 8.7 se almacenará realmente en 8.
  • Los bools también se convierten en números enteros, es decir, la clave verdadera se almacenará en 1 y la clave falsa en 0.
  • Null se convertirá en la cadena vacía, es decir, la clave nula se almacenará en "".
  • Las matrices y los objetos no se pueden utilizar como claves. Hacerlo resultará en una advertencia: Tipo de compensación ilegal.

Los tipos de recursos se pueden convertir a enteros ahora (no estoy seguro si se trata de una característica nueva), por lo que puede usar, por ejemplo, un identificador de archivo o un identificador de curl como clave indirectamente al convertirlo a entero y usarlo como clave.
thomasrutter

10

Encontré esta respuesta buscando más información sobre un problema que tenía. Estaba usando cadenas con caracteres UTF-8 en ellas, que no funcionarían como claves para una matriz que tenía.

Algo como

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

La solución (ni grande ni inteligente) para mí fue hacer esto ...

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

2
Me gusta md5 () para generar claves de matriz. Incluso si no es del todo necesario en este punto, todavía se siente más seguro.
billynoah

1
md5 () es perfecto para generar una clave de texto plano a partir de cualquier cadena. La seguridad no es el problema. También es bueno que sea rápido. El único problema es si deciden desaprobarlo y luego eliminarlo, porque ahora no es bueno para lo que fue diseñado originalmente. Veremos.
Patanjali

2
¿Estabas usando una versión anterior de PHP? Su primer ejemplo funciona bien en PHP 7.1.
Elliot B.

6

Las claves de matriz de PHP pueden ser números enteros o cadenas. Las cadenas de PHP son matrices de bytes, es decir, secuencias de bytes. No hay otros tipos de cadenas y PHP no impone restricciones especiales en las cadenas de claves de matriz. En otras palabras: mientras sea una cuerda, todo vale.


Creo que la conversión implícita de una cadena a una clave de número entero es una distinción importante, ya que ciertas funciones operan de manera diferente si la clave es un número entero o no. Por ejemplo, puede usar números de cadena arbitrarios solo para encontrar que una función de matriz luego los vuelve a indexar de 0..n-1.
Mateo

1
De acuerdo, pero creo que está en el límite del alcance de esta pregunta. :)
deceze

5

Todo lo que pueda introducir en una cadena PHP se puede utilizar como clave de matriz. No hay límite en los caracteres permitidos.

$a = array();

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

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

1

Si las claves complejas están provocando un error de "índice no definido", es posible que simplemente tenga un problema de "recorte".

Me estaba volviendo loco porque una clave compleja escupía el error de "índice indefinido" y pensé que tal vez era una violación de sintaxis. La clave de matriz que causa el error se creó a partir de un campo de una consulta de base de datos MySQL que estaba convirtiendo en una clave y usando en una nueva matriz. La clave se veía así: pl_1DNKoiJKwotCqAycickBVhTyy así es como se construyó el código.

//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];

cuando, de hecho, $keyvaly $dbquery['fieldname']parecía ser una combinación perfecta (verificado visualmente haciendo eco de ambos en el navegador). El misterio se resolvió simplemente usando trimen la segunda declaración de esta manera: $keyval = trim($array_two['fieldname']);Una vez 'recortado', php ya no se quejaba.

Esperando que esto salve a otros de algunos momentos frustrantes ...


0

Personalmente, no he tenido ningún problema con caracteres inusuales en las claves de matriz. Lo que es y no es legal no está bien documentado, aparte de decir que la clave debe ser un escalar. Tu mejor opción es probarlo y ver.


Un poco inconsistente, sí, pero está bien documentado.
Corbin

0

Además de todas las respuestas, ya que son verdaderas: puede usar PSR que son una especie de reglas entre los mejores programadores para tener un estilo de codificación agradable y estándar.


0

En la matriz php no puede usar la clave: 2.3 o números decimales


-1

Codifique la página php en ANSI "é" se podrá usar (Cinéma no aparecerá como Cinéma). En Notepad ++ simplemente use el menú Codificar => Convertir ANSI y guardar


2
(Esta publicación no parece proporcionar una respuesta de calidad a la pregunta. Edite su respuesta o simplemente publíquela como un comentario a la pregunta).
sɐunıɔ ןɐ qɐp

¿Puedes explicar eso más? ¿Qué pasa si éno está presente, qué pasa si el OP no usa Notepad ++ después de todo?
Nico Haase
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.