ArrayAccess, RecursiveArrayIterator

Résolu
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 15 juil. 2008 à 11:50
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 16 juil. 2008 à 09:37
Plop les gens :)
Je suis en train de me construire une classe avec des __get et des __set, et je me suis dit que si la personne voulait getter et setter des tableaux à n dimensions, ce n'était pas possible.

Pour cela, il y a ArrayAccess et RecursiveArrayIterator, mais j'ai googlé et j'ai rien de trouvé sur comment m'y prendre pour avoir quelque chose de fonctionnel.

Est-ce que quelqu'un aurait un exemple concret pour que je capte le fonctionnement et l'implémenter dans ma structure ?

Merci de votre aide :)

http://www.ReFlectiv.Net

2 réponses

JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
16 juil. 2008 à 01:05
Hello ^^

Je suis sur ce sujet depuis ce matin ^^ Et après pas mal de recherche, de patience et de cheveux en moins ... j'ai trouvé une méthode toute simple (le tout dans le OffGet) ^_____^ Mais bon, ça ne doit pas être la meilleur ...

Ensuite, faut juste un simple :
Class MyClass extends ArrayMultiDIterator
{
    function __construct()
    {
       parrent::__construct(array(1, 2, 3 => array(1, 2)));
    }
}

<hr size="2" width="100%" />

La Class :

/**
 * Class ArrayMultiDIterator
 */
Class ArrayMultiDIterator extends RecursiveIteratorIterator implements ArrayAccess
{
    private $_Array;

    /**
     * Le constructeur
     *
     * @param Array &$Array Un array multidimensionnel
     */
    public function __construct(Array &$Array)
    {
        if( !is_array($Array) ) // PHP 5.0.*
        {
            return ;
        }

        // Si $Array n'est pas une instance de RecursiveArrayIterator
        if( !( $Array instanceof RecursiveArrayIterator ) )
        {
            $Array = new RecursiveArrayIterator($Array);
        }

        $this -> _Array = $Array;

        parent::__construct($this -> _Array);
    }

    /**
     * ArrayAccess::offsetExists
     *
     * @param string $index
     * @returns mixed
     */
    public function offsetExists($key)
    {
        return array_key_exists($key, $this -> _Array);
    }

    /**
     * ArrayAccess::offsetGet
     *
     * @param string $index
     * @returns mixed
     */
    public function offsetGet($key)
    {
        if( array_key_exists($key, $this -> _Array) )
        {
            if( !is_array($this -> _Array [$key]) )
            {
                return $this -> _Array [$key];
            }
            else
            {
                return new self($this -> _Array [$key]);
            }
        }
        return ;
    }

        /**
     * ArrayAccess::offsetSet
     *
     * @param string $index
     * @param   mixed $value
     * @returns void
     */
    public function  offsetSet($key, $value)
    {
        $this -> _Array [$key] = $value;
    }

        /**
     * ArrayAccess::offsetUnset
     *
     * @param string $index
     * @returns void
     */
    public function offsetUnset($key)
    {
        unset($this -> _Array[$key]);
    }

    /**
     * magic method __set
     *
     * @param string $index
     * @returns void
     */
    public function __set($name, $value)
    {
        $this -> _Array [$name] = $value;
    }

    /**
     * Return normal array
     *
     * @param Array $Array optional
     * @returns mixed
     */
    public function returnArray($Array = null)
    {
        $Array = is_null($Array) ? $this -> _Array : $Array;
        $return = array();

        foreach( $Array as $Key => $Value )
        {
            if( $Value instanceof RecursiveArrayIterator )
            {
                $return [$Key] = $this -> returnArray($Value);
            }
            else
            {
                $return [$Key] = $Value;
            }
        }
        return $return;
    }
}

echo '';

$rec_array = array(
    1 => 'a',
    2 => 'b',
    3 => array(
       0 => 'c.1',
       1 => 'c.2',
       2 => 'c.3',
    ),
    4 => 'd',
);
$a = new ArrayMultiDIterator($rec_array);

// 1° -> On supprime $a[3][1]
unset($a[3][1]);

// 2° -> On édite $a[3][2] = 'c.2'
$a[3][2] = 'c.2';

// 3° -> On ajoute une valeur $a[3][3] = 'c.3'
$a[3][3] = 'c.3';

// Retourne un array MD "propre"
print_r($a -> returnArray());

foreach( $a as $key => $val )
{
    echo str_repeat('   ', $a -> getDepth()), ' ', $key, ' => ', $val, "\n";
}

echo '

';

?>

Et j'obtiens :

Array
(
[1] => a
[2] => b
[3] => Array
(
[0] => c.1
[2] => c.2
[3] => c.3
)

[4] => d
)

1 => a
2 => b
0 => c.1
2 => c.2
3 => c.3
4 => d

<hr />Si ma reponse te convient, merci de l'accepter ! 
1
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
16 juil. 2008 à 09:37
Merci pour la bonne description, je vais voir cela en détail ! :)

http://www.ReFlectiv.Net
0
Rejoignez-nous