Una cadena numérica como clave de matriz en PHP

Resuelto Dogbert asked hace 54 años • 11 respuestas

¿Es posible utilizar una cadena numérica como "123"clave en una matriz 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)
}
Dogbert avatar Jan 01 '70 08:01 Dogbert
Aceptado

No; no, no es:

Del manual :

Una clave puede ser un número entero o una cadena. Si una clave es la representación estándar de un número entero, se interpretará como tal (es decir, "8" se interpretará como 8, mientras que "08" se interpretará como "08").

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.

foo = { '10' : 'bar' };

foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!
Hamish avatar Nov 04 '2010 20:11 Hamish

Sí, es posible mediante la conversión de un stdClassobjeto en una matriz:

$data =  new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );

Eso te da (hasta la versión PHP 7.1):

array(1) {
  ["12"]=>
  int(37)
}

(Actualización: mi respuesta original mostraba una forma más complicada de usar json_decode()y json_encode()que no es necesaria).

Tenga en cuenta el comentario : lamentablemente no es posible hacer referencia al valor directamente: $data['12']generará 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:

var_dump( $data['12'] ); // int 32
David avatar Feb 03 '2016 15:02 David

Mi solución es:

$id = 55;
$array = array(
  " $id" => $value
);

El carácter espacial (anteponer) es una buena solución porque mantiene la conversión int:

foreach( $array as $key => $value ) {
  echo $key;
}

Verás 55 como int.

Undolog avatar Mar 14 '2013 15:03 Undolog

Si necesita utilizar una clave numérica en una estructura de datos php, un objeto funcionará. Y los objetos conservan el orden, por lo que puedes iterar.

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';
steampowered avatar Sep 19 '2011 21:09 steampowered