exemple :
+----+-----------+----------+-------+
| 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 :
Tout sélectionner
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 :
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
Tout sélectionner
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
Si on veux que la catégorie sois un autre champs il suffis de le mettre en premier (le prénom par exemple)
SELECT u.firstname, u.id, u.lastname, u.city FROM test_user u
Tout sélectionner
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
SELECT u.city, u.id, u.firstname, u.lastname, u.city FROM test_user u
-- ou version raccourcis
SELECT u.city, u.* FROM test_user u
Tout sélectionner
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
)
)
) |
Partager