JeuWeb - Crée ton jeu par navigateur
[Résolu] Organiser un output avec fetchAll - 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] Organiser un output avec fetchAll (/showthread.php?tid=7875)



[Résolu] Organiser un output avec fetchAll - MeTaLLiQuE - 26-09-2017

Hello,

J’essaie d’optimiser certaines parties de mon code, mais je bloque sur une optimisation :

J’ai une table a avec pour colonnes : id, u1, d4, q8 et contenant plusieurs lignes.

Pour des raisons x ou y, j’aimerais que toutes les lignes de ladite table sortent de l’output de cette façon :

u1 => array(
  u1 => valeur,
  d4 => valeur,
  q8 => valeur
);

J’ai essayé de regarder du côté des fetchAll et des fetch style & argument; cependant, je n’arrive pas  ce que ca prenne forme comme le schéma ci-dessus.

Auriez-vous une petite idée ? :/ (surtout si c’est faisable...)

Merci Smile


RE: Organiser un output avec fetchAll - Xenos - 26-09-2017

Code :
$rows = $pdoStm->fetchAll(PDO::FETCH_ASSOC);
$result = array_combine(array_column($rows, 'u1'), $rows);

Smile

La doc PHP propose une palanquée de fonctions sur les tableaux dans ce genre, pour la prochaine fois Wink

PS: Et si c'est indexé sur "id" et non sur "u1", il suffit de changer le nom de colonne dans le array_column pour "id"

PPS: Et je me demande si http://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-named FETCH_NAMED ne ferait pas la même chose, mais j'ai un doute (est-ce qu'il renvoie array('id' => array(10,20,30), 'u1' => array(4,5,6)...) ou le array(10 => array('u1' => ...), 20 => array(...), 30 => array(...)) recherché?!)


RE: Organiser un output avec fetchAll - julp - 26-09-2017

Ce n'est possible que si u1 est unique :
Code :
$stmt = $bdd->query('SELECT u1, u1, d4, q8 FROM a');
var_dump($stmt->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC));
?


RE: Organiser un output avec fetchAll - Xenos - 26-09-2017

Il me semble que FETCH_UNIQUE n'est qu'un simili-equivalent de DISTINCT (il ne fait qu'ignorer les lignes en double, pas les "u1 en double"). Sinon, oui, si u1 n'est pas unique, il y aura un soucis...

Et FETCH_ASSOC renvoie simplement le tableau associatif, donc là, julp, t'auras
Code :
array(
  array(
    'u1' => valeur,
    'd4' => valeur,
    'q8' => valeur));

et non
Code :
array(
  valeur[u1] => array(
    'u1' => valeur,
    'd4' => valeur,
    'q8' => valeur));



RE: Organiser un output avec fetchAll - julp - 26-09-2017

(26-09-2017, 04:38 PM)Xenos a écrit : Il me semble que FETCH_UNIQUE n'est qu'un simili-equivalent de DISTINCT (il ne fait qu'ignorer les lignes en double, pas les "u1 en double").
Les écraser surtout, plutôt qu'ignorer, tu ne verrais que la dernière ligne renvoyée pour une clé donnée, vu que la valeur précédente associée à une même clé serait écrasée.

(26-09-2017, 04:38 PM)Xenos a écrit : Sinon, oui, si u1 n'est pas unique, il y aura un soucis...
Oui, c'est sûr, c'est le principe même d'une table de hachage (les tableaux PHP étant un mélange des deux structures de données tableau et table de hachage) sinon il faut partir sur l'option PDO::FETCH_GROUP pour avoir un sous-tableau intermédiaire et qu'il n'y ait pas écrasement (ainsi on a un array_push interne dans le sous-tableau associée à une clé plutôt qu'une affectation).

(26-09-2017, 04:38 PM)Xenos a écrit : Et FETCH_ASSOC renvoie simplement le tableau associatif, donc là, julp, t'auras
Code :
array(
 array(
   'u1' => valeur,
   'd4' => valeur,
   'q8' => valeur));

et non
Code :
array(
 valeur[u1] => array(
   'u1' => valeur,
   'd4' => valeur,
   'q8' => valeur));

Ce sera bien la seconde forme avec PDO::FETCH_UNIQUE, cette option extrait la première colonne pour en utiliser la valeur comme clé (d'où u1 en double dans ma requête) mais je pense que de toute façon j'ai mal interprété la demande.


RE: Organiser un output avec fetchAll - MeTaLLiQuE - 27-09-2017

Salut,

Désolé pour la lenteur de ma réponse !

J'étais pas mal occupé ces derniers temps Smile

(26-09-2017, 09:43 AM)Xenos a écrit :
Code :
$rows = $pdoStm->fetchAll(PDO::FETCH_ASSOC);
$result = array_combine(array_column($rows, 'u1'), $rows);

Smile

Parfait, c'est ce que je recherchais merci Wink