Error de PHP con la conversión de objetos a matrices
Pregunta
Tenía esta pregunta anteriormente y se concluyó que era un error en 5.2.5. Bueno, todavía está roto en 5.2.6, al menos para mí:
Avíseme si está roto o funciona para usted:
$obj = new stdClass();
$obj->{"foo"} = "bar";
$obj->{"0"} = "zero";
$arr = (array)$obj;
//foo -- bar
//0 -- {error: undefined index}
foreach ($arr as $key=>$value){
echo "$key -- " . $arr[$key] . "\n";
}
Cualquier forma de " arreglar " la matriz después de haber sido emitida desde una clase estándar?
Solución
Definitivamente me parece un error (PHP 5.2.6).
Puede arreglar la matriz de esta manera:
$arr = array_combine(array_keys($arr), array_values($arr));
Se ha informado en este informe de error pero marcado como falso. . la documentación dice :
Las claves son la variable miembro nombres, con algunas excepciones notables: propiedades enteras son inaccesibles;
Otros consejos
Un poco de experimentación muestra que las funciones propias de phps no persisten en esta fubaridad.
function noopa( $a ){ return $a; }
$arr = array_map('noopa', $arr );
$arr[0]; # no error!
Esto, en efecto, solo crea una copia de la matriz y la solución se produce durante la copia.
En última instancia, es un error de diseño en todos los ámbitos, intente usar array_merge de la forma en que cree que funciona en una matriz con teclas numéricas y de cadena mixtas.
Todos los elementos numerados se copian y algunos se vuelven a numerar, incluso si algunos simplemente son números encapsulados en cadena, y como resultado, hay docenas de implementaciones homebrew de array_merge solo para resolver este problema.
Cuando php intentó hacer un clon de perl y falló, no entendieron el concepto de matrices y hashes como conceptos distintos, sino que los agruparon en un solo paraguas universal. ¡Buen curso!.
Para su próximo truco, logran romper los delimitadores del espacio de nombres debido a algún problema técnico que ningún otro idioma ha encontrado por alguna razón.
Gracias RoBorg .. Acabo de descubrir eso también :)
Aquí hay otra solución, no estoy seguro si es más rápido o no:
unserialize(serialize($arr));