¿Es posible usar una cadena numérica "123"
como una clave en una matriz de PHP, sin que se convierta en un número entero?
$blah = array('123' => 1);
var_dump($blah);
huellas dactilares
array(1) {
[123]=>
int(1)
}
quiero
array(1) {
["123"]=>
int(1)
}
"123"
==123
para casi todos los propósitos. ¿Cuál es la razón por la que lo quiere específicamente como una cadena (y tener un int es malo)?array_merge
"Si las matrices de entrada tienen las mismas claves de cadena, entonces el valor posterior de esa clave sobrescribirá al anterior. Sin embargo, si las matrices contienen claves numéricas , el valor posterior no sobrescribe el valor original, pero se agregará ".asort
Respuestas:
No; no, no es:
Del manual :
Apéndice
Debido a los comentarios a continuación, pensé que sería divertido señalar que el comportamiento es similar pero no idéntico a las claves de objetos de JavaScript.
fuente
Sí, es posible mediante la conversión de matriz de un
stdClass
objeto:Eso le da (hasta PHP versión 7.1):
(Actualización: mi respuesta original mostró una forma más complicada de usar
json_decode()
yjson_encode()
que no es necesaria).Tenga en cuenta el comentario : Desafortunadamente, no es posible hacer referencia al valor directamente:
$data['12']
resultará en un aviso.Actualización :
desde PHP 7.2 en adelante, también es posible usar una cadena numérica como clave para hacer referencia al valor:
fuente
echo $data['12'];
. Dará el error, "Aviso: Desplazamiento indefinido: 12 en - en la línea 5".array_key_exists
tampoco lo encontrará en las versiones anteriores.Si necesita usar una clave numérica en una estructura de datos php, un objeto funcionará. Y los objetos conservan el orden, por lo que puede iterar.
fuente
array()
, por lo que supongo que en ese contexto las cadenas que especifican números enteros válidos se convertirán en el tipo de número entero. Pero resulta que hay otras formas de crear matrices, donde eso no sucede, como en la respuesta de David, que he probado.Mi solución es:
El espacio char (anteponer) es una buena solución porque mantiene la conversión int:
Verás 55 como int.
fuente
"0$id" => $value
. Anteponer con0
obras también.Puede encasillar la clave en una cadena, pero eventualmente se convertirá en un número entero debido a la escritura suelta de PHP. Ver por ti mismo:
Del manual de PHP:
fuente
[42 => 'answer', 'snafu' => 'fubar']
Tuve este problema al intentar fusionar matrices que tenían claves de cadena y enteras. Era importante que los enteros también se manejaran como cadenas, ya que eran nombres para campos de entrada (como en tallas de zapatos, etc.)
Cuando usé
$data = array_merge($data, $extra);
PHP, 'reordenaría' las claves. En un intento de ordenar, las claves enteras (lo intenté con6
-'6'
-"6"
incluso(string)"6"
como claves) se renombraron de 0 an
... Si lo piensa, en la mayoría de los casos este sería el comportamiento deseado.Puede solucionar este problema utilizando en su
$data = $data + $extra;
lugar. Bastante sencillo, pero no pensé en eso al principio ^^.fuente
INCORRECTO
Tengo una función de conversión que maneja la conversión de matrices secuenciales a asociativas,
fuente
Como solución alternativa, puede codificar la matriz PHP en un objeto json, con la opción JSON_FORCE_OBJECT.
es decir, este ejemplo:
resultará en:
fuente
Me encontré con este problema en una matriz con '0' y '' como claves. Significaba que no podía verificar mis claves de matriz con == o ===.
La solución es convertir las claves de matriz de nuevo en cadenas antes de su uso.
fuente
Con respecto a la solución @david, tenga en cuenta que cuando intente acceder a los valores de cadena en la matriz asociativa, los números no funcionarán. Supongo que se convierten en números enteros detrás de escena (al acceder a la matriz) y no se encuentra ningún valor. Acceder a los valores como números enteros tampoco funcionará. Pero puede usar array_shift () para obtener los valores o iterar la matriz.
fuente
"0"
convierte0
en php7.2.10
.Tuve este problema al intentar ordenar una matriz donde necesitaba que la clave de clasificación fuera un hex sha1. Cuando un valor sha1 resultante no tiene letras, PHP convierte la clave en un número entero. Pero necesitaba ordenar la matriz según el orden relativo de las cadenas. Así que necesitaba encontrar una manera de forzar que la clave fuera una cadena sin cambiar el orden de clasificación.
Mirando la tabla ASCII ( https://en.wikipedia.org/wiki/ASCII ), el signo de exclamación se ordena casi igual que el espacio y ciertamente más bajo que todos los números y letras.
Así que agregué un signo de exclamación al final de la cadena de teclas.
fuente