Usando ArrayObject para almacenar arreglos
Frecuentes
Visto 185 veces
2
Estoy tratando de almacenar una matriz y manipular esa matriz usando una clase personalizada que extiende ArrayObject.
class MyArrayObject extends ArrayObject {
protected $data = array();
public function offsetGet($name) {
return $this->data[$name];
}
public function offsetSet($name, $value) {
$this->data[$name] = $value;
}
public function offsetExists($name) {
return isset($this->data[$name]);
}
public function offsetUnset($name) {
unset($this->data[$name]);
}
}
El problema es si hago esto:
$foo = new MyArrayObject();
$foo['blah'] = array('name' => 'bob');
$foo['blah']['name'] = 'fred';
echo $foo['blah']['name'];
La salida es bob y no fred. ¿Hay alguna manera de que esto funcione sin cambiar las 4 líneas anteriores?
1 Respuestas
3
Este es un comportamiento conocido de ArrayAccess ("Aviso de PHP: la modificación indirecta del elemento sobrecargado de MyArrayObject no tiene efecto"...).
http://php.net/manual/en/class.arrayaccess.php
Implemente esto en MyArrayObject:
public function offsetSet($offset, $data) {
if (is_array($data)) $data = new self($data);
if ($offset === null) {
$this->data[] = $data;
} else {
$this->data[$offset] = $data;
}
}
contestado el 22 de mayo de 12 a las 15:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php arrays arrayobject or haz tu propia pregunta.
El problema con eso es que las matrices se almacenan como objetos, por lo que si configuro una matriz de valores, entonces tengo que llamar
toArray()
antes de recorrerlos. - incendio@fire Implementar iterador y contable tal vez? - flujo loco