IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[SPL] Itérateurs et modifications récursives des paramètres $_POST


Sujet :

Langage PHP

  1. #1
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut [SPL] Itérateurs et modifications récursives des paramètres $_POST
    Bonjour à tous,

    Avant de me pendre, j'aimerais vous exposer un petit soucis... Novice en SPL, n'ayant pas de contacts susceptibles de me renseigner à ce sujet et livré seul face à la quasi non documentation sur les itérateurs, je me retrouve heurté face à un petit problème de compréhension.

    Parser un tableau avec des itérateurs récursifs, aucun soucis, on trouve plein d'exemples... Modifier le contenu du dit tableau, c'est déjà plus difficile !

    L'idée là c'est de passer un utf8_decode d'emblée en cas d'appel AJAX. Evidemment mes formulaires posts son sur n niveaux, pour faciliter le tout. Je vous cite un morceau choisis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $params = $_POST;
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($params));
     
    foreach ($iterator as $name => $value)
    {
    	$iterator->offsetSet($name, utf8_decode($value));
    	echo "$name => " . $iterator->offsetGet($name) . "<br/>";
    }
     
    print_r($iterator->getArrayCopy());
    Cet extrait est adapté, extrait d'un projet basé sur le Zend Framework. Mais la logique est la même à trois fois rien prêt vu que je travaille sur un Array.

    Pour un tableau array('name' => 'Français'); j'ai la sortie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    name => Français
    array(1) {
    ["name"] => string(9) "Français"
    }
    Cet exemple est totalement édulcoré, et bien sûr mon exemple est beaucoup plus complexe.

    J'ai essayé de multiples variantes (au début j'appelais $iterator->getInnerIterator()->offsetSet(...) avant de comprendre que RecursiveIteratorIterator appelait tout seul comme un grand la méthode sur l'itérateur qu'il encapsulait ), et j'ai toujours ce problème. J'ai même essayé de dumper le tableau au sein de ma boucle, et là c'est encore plus délirant:

    J'ai une sortie "correcte" name => "Français", puis, je passe dans un "sous tableau", et à la fin j'ai de nouveau le tableau global en utf8... Je sens très gros un passage de tableau par copie qui perds mes modifications en cours de route... Et j'ai essayé aussi de créer explicitement un ArrayObject avec $_POST, sans succès non plus.

    Si des rôdés de la SPL pouvait me sortir de ma détresse, ils auraient ma gratitude éternelle

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut
    Complément d'infos sur le problème.

    Soit le source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $params = new ArrayObject($_POST);
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($params));
     
    foreach ($iterator as $name => $value)
    {
    	echo str_pad('', $iterator->getDepth(), '+');
    	$iterator->offsetSet($name, utf8_decode($value));
    	echo "$name => " . $iterator->offsetGet($name) . "<br/>";
    	print_r($iterator->getArrayCopy());	
    }
    En somme voilà ce qui se passe:
    J'ai 2 niveaux d'imbrications dans mon $_POST, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    array(
       'row' => array(...),
       'orga' => array(
          tva => array(...),
          siret => array(...),
          ...
       ),
       id => string,
       valid => string
    )
    Mes premiers dumps me "décodent" progressivement mes chaines accentuées, sans soucis tant qu'on est dans le tableau "row".
    Ensuite on passe aux tableaux orga, puis tva, puis siret. Je contrôle le niveau de profondeur via le str_pad(), tout se passe comme souhaité.
    Je passe au niveau le plus haut, et là toutes mes variables précédemment décodées ne le sont plus...

    Ce que je pense, après avoir fait des dumps:
    L'objet ArrayObject contient une imbrication d'Array, et non une imbrication d'ArrayObject... J'imagine que chaque niveau de profondeur travaille donc sur un Array, passée par valeur, et du coup chacun bosse sur sa propre copie du tableau... Je ne vois pas d'autre raison pour laquelle on reviendrait mystérieusement aux valeurs précédentes ?!

    Bug de la SPL, ou bug du programmeur ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 10
    Points
    10
    Par défaut salut!
    Le message date un peu, mais je tente...
    "Si des rôdés de la SPL pouvait me sortir de ma détresse,
    ils auraient ma gratitude éternelle"... désolé, mais je ne suis pas de ce là, bien au contraire...
    J'espère que tu as résolu ton problème depuis....
    Il se trouve qu'à mon tour je me retrouve plus ou poins dans le même cas que toi à galérer face au manque de docs...
    Je me met à la POO et à la SPL conjointement (ouais je sais, je suis téméraire...)
    et je rame depuis 6jours maintenant et je pense que tu pourrais en 3 lignes débloquer mon problème...
    Avant de te soumettre du code je vais voir déjà si d'une tu me réponds.. et de deux si ça te dis de me filer un petit coup de main!
    6 jours, c'est long...

    Si tu pouvais me sortir de ma détresse,
    tu aurais ma gratitude éternelle

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($params));
    Tu fais un RecursiveIteratorIterator d'un RecursiveArrayIterator ? Pourquoi ? Est-ce que la modif que tu fais ne se fait pas uniquement sur le RecursiveIteratorqui lui même a fait une copie de ton objet RecursiveArray ?

    Juste une piste...

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Points : 637
    Points
    637
    Par défaut
    Citation Envoyé par megar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($params));
    Tu fais un RecursiveIteratorIterator d'un RecursiveArrayIterator ? Pourquoi ? Est-ce que la modif que tu fais ne se fait pas uniquement sur le RecursiveIteratorqui lui même a fait une copie de ton objet RecursiveArray ?

    Juste une piste...
    Bien que le sujet date un peu, j'avoue ne pas vraiment comprendre pourquoi j'ai instancié un RecursiveIteratorIterator à partir de mon RecursiveArrayIterator... Et en effet ça expliquerait pas mal de choses. Je vais tester ça, merci pour la piste.

    Edit: Après essai, pas de meilleurs résultats, mais au moins une approche plus logique

    @sebb13: réponse en MP

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/10/2010, 15h48
  2. Réponses: 1
    Dernier message: 08/12/2007, 16h56
  3. Réponses: 2
    Dernier message: 05/11/2007, 15h23
  4. Réponses: 3
    Dernier message: 08/02/2007, 23h14
  5. Modification des paramètres régionaux et folders options
    Par Looping_V60 dans le forum Access
    Réponses: 1
    Dernier message: 07/06/2006, 20h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo