Algunas de las otras soluciones publicadas aquí no dicen matrices aparte secuenciales (lo que sería []
en JS) a partir de mapas ({}
en JS.) Para muchos casos de uso, es importante diferenciar las matrices PHP que tienen todas las claves numéricas secuenciales, que deberían dejarse como tales, de las matrices PHP que no tienen claves numéricas, que deberían convertirse en objetos. (Mis soluciones a continuación no están definidas para matrices que no se encuentran en las dos categorías anteriores.)
El método json_decode(json_encode($x))
maneja los dos tipos correctamente, pero no es la solución más rápida. Todavía es decente, aunque, por un total 25μs por corrida en mis datos de la muestra (un promedio de más de 1 m corre, menos la sobrecarga de bucle.)
I Benchmarked un par de variaciones del convertidor recursiva y terminó con la siguiente. Reconstruye todas las matrices y objetos (realizando una copia profunda) pero parece ser más rápido que las soluciones alternativas que modifican las matrices en su lugar.Es relojes en 11μs por cada ejecución en mi datos de la muestra:
function array_to_object($x) {
if (!is_array($x)) {
return $x;
} elseif (is_numeric(key($x))) {
return array_map(__FUNCTION__, $x);
} else {
return (object) array_map(__FUNCTION__, $x);
}
}
Aquí está una versión en el lugar. Puede ser más rápido en algunas datos de entrada grandes, donde sólo pequeñas partes necesitan ser convertidos, pero en mi datos de la muestra se tomó 15μs por cada ejecución:
function array_to_object_inplace(&$x) {
if (!is_array($x)) {
return;
}
array_walk($x, __FUNCTION__);
reset($x);
if (!is_numeric(key($x))) {
$x = (object) $x;
}
}
Yo no probar soluciones utilizando array_walk_recursive()
Es posible que las matrices PHP tengan claves vacías, pero los objetos no pueden tener propiedades vacías. Podría valer la pena cambiar el 'else' por' elseif ($ k! == '') ' – Andy
@Andy Fixed, ¡gracias! –
¡Gracias por notar que no se puede hacer solo con elseif! – Andy