Usando ArrayObject para almacenar arreglos

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?

preguntado el 22 de mayo de 12 a las 14:05

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.