|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Salut à tous
Je cherche le moyen d'accéder par le biais d'une méthode à un élément d'un Objet ArrayObject à 2 dimensions (par exemple). A une dimension, pas de problème : Code :
Code :
Quelque chose du genre : Code :
Code :
Puis passer une chaine en argument pour un clé à 2 dimension me semble pas très zen. Parcourir (genre foreach) le tableau me parait ingérable (beaucoup trop hasardeux). Sinon, j'ai pensé à mettre plusieurs paramètres à la méthode, genre getArrayObj($key, $key_dim2 = NULL, $key_dim3 = NULL, ...). Ca pourrait ce faire, mais c'est pas très académique, non ? Il y aurait peut être les fonctions func_num_args() et func_get_args, mais là je ne vois pas trop pour le moment. Le dernier recourt serait de rendre $arrayObj publique et statique, mais ça m'embête un peu beaucoup. S'il quelqu'un a une piste
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||||||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Et bien c'est très simple finalement avec func_num_args() et func_get_args().
Pour le moment j'ai fait très basique, un peu limité à 4 dimensions, mais bon ... Code :
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
|
|
#3 | ||||
|
Expert Confirmé
![]() Inscription : mars 2005 Messages : 2 815 ![]() |
Au final tu veux accéder à un élément de tableau d'une profondeur quelconque en précisant son chemin, non ?
Regarde ça : Code :
Code :
Code :
print_r(array_access('Terre', 'Asie', 'Japon')) ;
__________________
Un problème exposé clairement est déjà à moitié résolu Keep It Smart and Simple |
||||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Ca fonctionne très bien ![]() Le petit bémol que je mettrais, c'est qu'il faille initialiser une variable qui va contenir l'intégralité du tableau $this->arrayObj (ou dans ton exemple $data). En quelque sorte, j'aurais 2 fois les mêmes données (à une courte période certes). Il y a détail cependant qui m'interpelle dans la définition de la méthode offsetGet au niveau de la doc, car la méthode existe finalement. Citation:
A un moment je me suis dis que ça accepterait un tableau genre $argument('Terre', 'Asie', 'Japon') qui supposerait que ça ferait comme dans ton exemple automatiquement. Mais ça n'accepte pas de tableau visiblement. Donc le mixed se limiterait soit à une chaine soit un integer. M'enfin, c'est par déduction. J'ai fais des recherches sur GG pour tenter de trouver des exemples sur cette méthode offsetGet pour accéder à un tableau à plusieurs dimensions, j'ai franchement rien trouvé. ![]() Mes essais démontrent que cette méthode ArrayObject::offsetGet se limiterait à accéder la 1ère dimension, se que je trouve fort dommage.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : septembre 2010 Messages : 7 057 ![]() |
c'est normal les clés de tableau c'est de type int ou de type string
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#6 | ||
![]() ![]() Inscription : septembre 2010 Messages : 7 057 ![]() |
et faire comme ca
Code :
__________________
http://blog.stealth35.com/ |
||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Mais là, il faut faire appel directement à l'Objet $arr pour obtenir la valeur de la 2ème dimension (un). Ou alors, recréer un autre Objet (FinderArrayObject) avec l'intégralité de l'Objet ArrayObject, etc, etc ... pour au final obtenir 1 élément. C'est un peu démesuré, non ? S'il n'y a pas un moyen simple et quasi natif à ArrayObject pour ça, et bien tant pis, il y a quand même les 2 solutions.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
|
|
#8 | |
|
Expert Confirmé
![]() Inscription : mars 2005 Messages : 2 815 ![]() |
Citation:
__________________
Un problème exposé clairement est déjà à moitié résolu Keep It Smart and Simple |
|
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Vous avez bien fait d'insister, car je pense que avoir fait fausse route, ou plus familièrement, un peu déliré sur ce coup là.
Je qualifierait ça comme un vrai faux problème. Si je déclare publique et statique l'Objet/tableau arrayObj, aucun problème vu qu'il sera accessible de l'extérieur. Donc à l'inverse (pas statique en tout cas, c'est comme ça que je le souhaite), c'est que arrayObj sera ou devra de toute manière être accessible dans la classe, ne serait-ce que par héritage. Du coup, au lieu de me compliquer la vie comme jusqu'à lors, autant utiliser directement $this->arrayObj, quitte à créer une méthode pour le récupérer intégralement. Puis ensuite, m'arranger à faire : Code :
Je mets fin à ce topic, car j'ai un autre chose sur le feu qui n'est pas loin de me donner mal au crâne. Merci à vous en tout cas.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com