JeuWeb - Crée ton jeu par navigateur
[Test de développement] Transformer une query string en tableau associatif - 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 : [Test de développement] Transformer une query string en tableau associatif (/showthread.php?tid=4948)

Pages : 1 2 3


[Test de développement] Transformer une query string en tableau associatif - Sephi-Chan - 28-06-2010

Hello,

En lisant la documentation de l'API de Facebook, je suis tombé sur une problématique : celle de transformer une query string en un tableau associatif. Et je me suis dit que ça pouvait être un test de développement sympa.

Le but du jeu est donc de partir d'une chaîne comme ceci (spéciale dédicace à ceux qui ont aimé les romans de Roger Zelazny) :


name=Corwin&title=Prince of Amber&brothers[]=Benedict&brothers[]=Eric&equipment[sword]=Grayswandir

Et d'arriver à un tableau associatif comme celui-ci (je donne l'exemple au format YAML, mais il faut bien sûr utiliser une structure de données du langage utilisé) :


---
name: Corwin
title: Prince of Amber
brothers:
- Benedict
- Eric
equipment:
sword: Grayswandir

Ainsi, les clés de la forme xxx sont des scalaires, les clés de la forme xxx[] sont des tableaux et les clés de la forme xxx[xxx] sont des tableaux associatifs (aussi appelés hash ou dictionnaires).

PHP dispose nativement d'une fonction pour effectuer cette manipulation, il s'agit de parse_str(). Mais l'exercice est bien de créer une fonction alternative.

Je présenterai mon implémentation en Ruby un peu plus tard, pour ne pas fausser la créativité des participants.


Sephi-Chan


RE: [Test de développement] Transformer une query string en tableau associatif - Shudrum - 28-06-2010

/!\ EDIT : en suivant le sujet, j'ai remarqué que j'avais pas du tout compris le truc ^^ Je m'y lance ptet ce soir.


RE: [Test de développement] Transformer une query string en tableau associatif - atra27 - 28-06-2010

Bon allé je sais je ralle en disant que c'est inutile mais je l'ai fait quand méme pour le fun! Big Grin

http://pastebin.com/EZkHMrXX

Je vais encore me faire tapper dessus pour l'indentation ou la lisibilité du code mais bon...

Démo en live: http://www.spacevolution.fr.nf/dev/6676.php

Ps: je suis pas doué pour les noms de variable (promis j'ai essayé ^^) donc j'ai mis en commentaire leur utilité au début de la fonction...


RE: [Test de développement] Transformer une query string en tableau associatif - Myrina - 28-06-2010

Bonjour,

Depuis le temps que je lis votre forum, je m'inscris enfin car j'ai trouvé intéressant de faire ce petit exercice.

Voici donc ma version: http://pastebin.com/x3gmj1pT


RE: [Test de développement] Transformer une query string en tableau associatif - Anthor - 28-06-2010

Dans vos exemples, il manque le deuxième paramètre de la fonction, ainsi que l'url_decode.
Vous remarquerez d'ailleurs que son fonctionnement n'est pas celui que vous avez renvoyé : http://php.net/manual/en/function.parse-str.php


RE: [Test de développement] Transformer une query string en tableau associatif - atra27 - 28-06-2010

(28-06-2010, 02:26 AM)Sephi-Chan a écrit : Le but du jeu est donc de partir d'une chaîne comme ceci (spéciale dédicace à ceux qui ont aimé les romans de Roger Zelazny) :

Je vois ou on parle de url ici Big Grin

La problématique etait de partir d'un chaine pour obtenir le résultat demandé!
Hors la les scripts répondes a la problématique...


RE: [Test de développement] Transformer une query string en tableau associatif - Myrina - 28-06-2010

(28-06-2010, 11:25 AM)Anthor a écrit : Dans vos exemples, il manque le deuxième paramètre de la fonction
L'énoncé de l'exercice ne stipule pas de second paramètre...
Et si il s'agit d'un rapprochement avec la fonction parse_str, il faudra m'expliquer l'intérêt d'utiliser une pratique quand elle est mauvaise.


RE: [Test de développement] Transformer une query string en tableau associatif - Sephi-Chan - 28-06-2010

Je masque les commentaires inutiles : vous participez ou non, mais ne polluez pas.
Tous les langages n'ont pas cette fonctionnalité nativement (par exemple en Ruby, la méthode parse de la classe CGI ne convient pas exactement : elle conserve les crochez dans le nom des tableaux indexés, par exemple "brothers[]").

Je parle seulement du passage d'un format sérialisé (en l'occurrence celui d'une query string) en un. Le but n'est pas de cloner la fonction parse_str() de PHP. D'ailleurs, la première forme (sans second argument) ne devrait même pas exister : bonjour les effets de bords que ça peut causer… Smile

Voici ma première implémentation : elle peut renvoyer un nouveau hash ou modifier celui donné en second argument (mais ça ne faisait pas partie de l'énoncé).

Voici la même version en plus symbolique : l'utilisation des variables $1, $2, etc. crées lorsqu'on utilise la méthode match. Ça permet d'être plus concis mais c'est moins lisible, je trouve…

J'ai choisi de bien séparer les différents cas plutôt que d'utiliser une grosse regexp.


Sephi-Chan


RE: [Test de développement] Transformer une query string en tableau associatif - Cartman34 - 28-06-2010

Patebin: http://pastebin.com/WLUBbKb3
Ces fonctions sont en fait des méthodes static de ma classe URL.
Au départ, je voulais laisser comme c'était car c'était plus simple que mes prédécesseurs mais au final, j'ai préféré implémenté la gestion total des tableaux multidimensionnels.

Exemple: Issu de celui de Sephi-Chan.
QUERY STRING : "name=Corwin&title=Prince of Amber&browsers[]=Benedict&browsers[]=Eric&equipment[sword]=Grayswandir&quests[][step1]=Get Graal"
Résultat:
Code PHP :
<?php 
Array
(
[
name] => Corwin
[title] => Prince of Amber
[browsers] => Array
(
[
0] => Benedict
[1] => Eric
)
[
equipment] => Array
(
[
sword] => Grayswandir
)
[
quests] => Array
(
[
0] => Array
(
[
step1] => Get Graal
)
)
)



RE: [Test de développement] Transformer une query string en tableau associatif - garf - 28-06-2010


function str2array($string){
$return = array();
$array = explode('&', $string);
foreach( $array as $item){
preg_match('#(\w*)(\[\w*?\])?=(.*)#ui', $item, $match);
switch( strlen($match[2]) ){
case 0:
$return[$match[1]] = $match[3];
break;
case 2:
$return[$match[1]][] = $match[3];
break;
default :
$return[$match[1]][$match[2]] = $match[3];
break;
}
}
return $return;
}