PDO offre une option intéressante dans son fetchMode : PDO::FETCH_GROUP qui permet de grouper des entrées par catégorie.
exemple :
Code php
Citation:
+----+-----------+----------+-------+
| id | firstname | lastname | city |
+----+-----------+----------+-------+
| 1 | Jean | Machin | Paris |
| 2 | Jean | Truc | Nice |
| 3 | Paul | Bla | Nice |
+----+-----------+----------+-------+
on a envie de trier les utilisateur par ville pour avoir une sortie type :
Citation:
Paris
Jean Machin
Nice
Jean Truc
Paul Bla
plusieurs solutions :
Faire une requête DISTINCT sur les villes, et a chaque tour de boucle allé chercher les personnes qui correspondes
Créer un array temporaire et a chaque tour de boucle ajouter la personne ($tmp[$user['city']][] = $user) , et reboucler ensuite pour créer son tableau
A chaque tour de boucle vérifier via un buffer si la ville a été mise et afficher les personnes, sinon afficher ville
la solution PDO :
Grâce au fetchAll et son option PDO::FETCH_GROUP, on a en sortie directement un array formateé, avec en clé la catégorie et en valeur les entrées correspondantes
(par contre attention contraiement a PDO::FETCH_COLUMN, on ne choisie pas qui est la catégorie, ca sera uniquement la première colonne)
exemple de code :
Code php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| try
{
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch (Exception $e)
{
exit($e->getMessage());
}
$query = $pdo->query("SELECT u.city, u.id, u.firstname, u.lastname FROM test_user u");
if($query)
{
$result = $query->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
print_r($result);
} |
en sortie
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| Array
(
[Paris] => Array
(
[0] => Array
(
[id] => 1
[firstname] => Jean
[lastname] => Machin
)
)
[Nice] => Array
(
[0] => Array
(
[id] => 2
[firstname] => Jean
[lastname] => Truc
)
[1] => Array
(
[id] => 3
[firstname] => Paul
[lastname] => Bla
)
)
) |
tout simplement :wink:
Si on veux que la catégorie sois un autre champs il suffis de le mettre en premier (le prénom par exemple)
Code:
SELECT u.firstname, u.id, u.lastname, u.city FROM test_user u
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| Array
(
[Jean] => Array
(
[0] => Array
(
[id] => 1
[lastname] => Machin
[city] => Paris
)
[1] => Array
(
[id] => 2
[lastname] => Truc
[city] => Nice
)
)
[Paul] => Array
(
[0] => Array
(
[id] => 3
[lastname] => Bla
[city] => Nice
)
)
) |
et on peux bien sur doubler les valeurs pour avoir des entrées complètes, ce qui sera d'ailleurs plus simple, au niveau portabilité et pour différentes sorties
Code:
SELECT u.city, u.id, u.firstname, u.lastname, u.city FROM test_user u
-- ou version raccourcis
Code:
SELECT u.city, u.* FROM test_user u
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Array
(
[Paris] => Array
(
[0] => Array
(
[id] => 1
[firstname] => Jean
[lastname] => Machin
[city] => Paris
)
)
[Nice] => Array
(
[0] => Array
(
[id] => 2
[firstname] => Jean
[lastname] => Truc
[city] => Nice
)
[1] => Array
(
[id] => 3
[firstname] => Paul
[lastname] => Bla
[city] => Nice
)
)
) |