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?
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?
Respuestas:
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);
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.
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!
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.
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_1DNKoiJKwotCqAycickBVhTy
y 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, $keyval
y $dbquery['fieldname']
parecía ser una combinación perfecta (verificado visualmente haciendo eco de ambos en el navegador). El misterio se resolvió simplemente usando trim
en 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 ...
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.
En la matriz php no puede usar la clave: 2.3 o números decimales
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
é
no está presente, qué pasa si el OP no usa Notepad ++ después de todo?
$a = (object) ['@km³' => 123]; error_log($a->@km³);