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?

¿Fue útil?

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));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top