JeuWeb - Crée ton jeu par navigateur
[Résolu][SPL]ArrayAccess avec tableau multi-dimension - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][SPL]ArrayAccess avec tableau multi-dimension (/showthread.php?tid=3877)



[Résolu][SPL]ArrayAccess avec tableau multi-dimension - jo_link_noir - 10-04-2009

Bonjour

Pour ce qui connaisse pas, ArrayAccess est une classe d'interface de php5. Elle permet d'accéder à un objet comme si s'était un tableau.
Le problème c'est qu'à partir du moment ou je le fait sur un tableau à plus d'une dimension, patatras, j'obtient ce magnifique message :
Citation :Indirect modification of overloaded element of MyArray has no effect
Pas super cool :/. Après une 1h à faire bidouille et autre j'ai fini par avoir le fonctionnement voulu, mais j'aime pas trop. Regardez offsetGet et surtout le constructeur, je trouve ça louche mais ça marche bien...

Donc bon voilà, juste pour savoir si vous aviez pas mieux Smile ?

Bonne soirée.

Code PHP :
<?php 
class MyArray implements ArrayAccess
{
public
$array;

function
__construct($a=array())
{
$this->array = &$a;
}

// Retourne une valeur contenue dans le tableau
public function offsetGet($offset)
{
if (isset(
$this->array[$offset]))
if (
is_array($this->array[$offset]))
return new
MyArray(&$this->array[$offset]);
else
return
$this->array[$offset];
$this->array[$offset] = array();
return new
MyArray(&$this->array[$offset]);
}

// Méthode d'ajout d'une valeur dans le tableau
function offsetSet($offset, $value)
{
$this->array[$offset] = $value;
return
$this;
}

// Supprime une valeur du tableau
public function offsetUnset($offset)
{
unset(
$this->array[$offset]);
}

// Test si une valeur existe dans le tableau
public function offsetExists($offset)
{
return isset(
$this->array[$offset]);
}
}

$myArray = new MyArray;
$myArray[2] = 10;
$myArray[3][1][0] = 12;
$myArray2 = new MyArray(array(0=>'valeur qui va être effacer', 1=>'plop'));
$myArray2[0] = 10;
$myArray2[3] = 12;

echo
$myArray[3][1][0]."\n";

var_dump($myArray->array, $myArray2->array);



RE: [SPL]ArrayAccess avec tableau multi-dimension - jo_link_noir - 12-04-2009

ArrayIterator fait très bien l'affaire.

Code PHP :
<?php 
class A{
}

$myArray = new ArrayIterator;
$myArray[2] = 10;
$myArray[3] = array(); // obliger sinon erreur à la ligne suivante
$myArray[3][1][0] = new A;

$myArray2 = new ArrayIterator(array(0=>'valeur qui va être effacer', 1=>'plop'));
$myArray2[0] = 10;
$myArray2[3] = 12;
$myArray2[] = $myArray;
$myArray2[4][1] = 8;

var_dump($myArray->getArrayCopy(), $myArray2->getArrayCopy());

foreach (
$myArray2 as $k => $v)
{
echo
"\n[$k] => ";
print_r($v);
}