[Résolu] Organiser un output avec fetchAll
#1
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 2
Répondre
#2
Code :
$rows = $pdoStm->fetchAll(PDO::FETCH_ASSOC);
$result = array_combine(array_column($rows, 'u1'), $rows);

2

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

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.p...etch-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é?!)
Répondre
#3
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));
?
Répondre
#4
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));
Répondre
#5
(09-26-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.

(09-26-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).

(09-26-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.
Répondre
#6
Salut,

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

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

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

2

Parfait, c'est ce que je recherchais merci 16
Répondre




Utilisateur(s) parcourant ce sujet : 1 visiteur(s)