ArrayAccess, RecursiveArrayIterator [Résolu]

codefalse 1127 Messages postés mardi 8 janvier 2002Date d'inscription 21 avril 2009 Dernière intervention - 15 juil. 2008 à 11:50 - Dernière réponse : codefalse 1127 Messages postés mardi 8 janvier 2002Date d'inscription 21 avril 2009 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
JoJo738 1267 Messages postés mercredi 7 juillet 2004Date d'inscription 29 juin 2010 Dernière intervention - 16 juil. 2008 à 01:05
1
Merci
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 ! 

Merci JoJo738 1

codes-sources a aidé 81 internautes ce mois-ci

Commenter la réponse de JoJo738
codefalse 1127 Messages postés mardi 8 janvier 2002Date d'inscription 21 avril 2009 Dernière intervention - 16 juil. 2008 à 09:37
0
Merci
Merci pour la bonne description, je vais voir cela en détail ! :)

http://www.ReFlectiv.Net
Commenter la réponse de codefalse

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.