¡NO PUEDE!
Las cadenas que contienen enteros válidos se convertirán al tipo de entero. P.ej. la clave "8" se almacenará en realidad en 8. Por otro lado, "08" no se emitirá, ya que no es un número entero decimal válido.
Editar:
En realidad se puede !! Cast sequential array to associative array
$obj = new stdClass;
foreach($array as $key => $value){
$obj->{$key} = $value;
}
$array = (array) $obj;
En la mayoría de los casos, la siguiente cita es cierto.
Las cadenas que contienen números enteros válidos se convertirán al tipo de entero. P.ej. la clave "8" se almacenará en realidad en 8. Por otro lado, "08" no se emitirá, ya que no es un número entero decimal válido.
Este ejemplo de PHP Docs
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(1) {
[1]=> string(1) "d"
}
Así que incluso si tuviera que crear una matriz con teclas numeradas que sólo conseguirían emitidos vuelta a enteros.
Desafortunadamente para mí no estaba al tanto de esto hasta hace poco pero pensé que compartiría mis intentos fallidos.
Los intentos fallidos
$arr = array_change_key_case($arr); // worth a try.
Devuelve una matriz con todas las claves de serie a mayúsculas o minúsculas. Los índices numerados se dejan como está.
Mis próximos intentos fueron crear una nueva matriz por array_combine
ing old values the new (string) keys.
Intenté varias maneras de hacer que la matriz $keys
contenga valores numéricos de tipo cadena.
range("A", "Z")
funciona para el alfabeto, así que pensé que lo intentaría con una cadena numérica.
$keys = range("0", (string) count($arr)); // integers
Esto dio como resultado una matriz llena de teclas, pero todas eran del tipo int.
Aquí hay un par de intentos exitosos de crear una matriz con los valores de tipo cadena.
$keys = explode(',', implode(",", array_keys($arr))); // values strings
$keys = array_map('strval', array_keys($arr)); // values strings
Ahora solo para combinar los dos.
$arr = array_combine($keys, $arr);
Esto es cuando descubrí que las cadenas numéricas están convertidas en enteros.
$arr = array_combine($keys, $arr); // int strings
//assert($arr === array_values($arr)) // true.
La única manera de cambiar las claves para cuerdas y mantener sus valores literales sería para prefijar la clave con un sufijo con un punto "00","01","02"
o "0.","1.","2."
decimal.
Puede lograrlo de esta manera.
$keys = explode(',', implode(".,", array_keys($arr)) . '.'); // added decimal point
$arr = array_combine($keys, $arr);
Por supuesto, esto es menos que ideal, ya que tendrá que apuntar a elementos de la matriz como este.
$arr["280."]
He creado una pequeña función que se centrará en el elemento de la matriz correcta incluso si sólo se introduce el número entero y no a la nueva cadena.
function array_value($array, $key){
if(array_key_exists($key, $array)){
return $array[ $key ];
}
if(is_numeric($key) && array_key_exists('.' . $key, $array)){
return $array[ '.' . $key ];
}
return null;
}
Uso
echo array_value($array, "208"); // "abc"
Editar:
En realidad se puede !! Cast sequential array to associative array
Todo eso por nada
Tenía el mismo problema. Obtuve claves como "0", "1" en los datos de entrada (de http request) y quería filtrar utilizando 'array_intersect_key' ... parece que utilizaré otro enfoque. – kirilloid
Posible duplicado de [Una cadena numérica como clave de matriz en PHP] (http://stackoverflow.com/questions/4100488/a-numeric-string-as-array-key-in-php) – Flimm
@Flimm Se hizo esa pregunta después del mío, entonces es un duplicado de este. – alex