Les collections en PHP¶
En PHP standard, Collections = Arrays :¶
Si on se contente de ce qu’offre PHP en standard, les collections se résument à l’utilisation des tableaux associatifs en PHP
Le framework des Collections en Java est beaucoup plus riche
DataStructures ds:¶
Il faut installer une librairie supplémentaire ds (DataStructures) pour avoir accès à un Framework similaire en PHP.
Voir Documentation Collections php
On va pour utiliser la commande pecl pour installer ds comme une extension:
pecl install ds
Puis charger l’extension en ajoutant aux fichiers .ini de PHP:
extension=ds.so
Cette extension nous donne accès à des classes similaires à celles du framework des Collections en Java. Les classes proposées sont par exemple:
Sequence
Vector
Deque
Vector
Pair
Set
Stack
Queue
PriorityQueue
Utilisation de Ds:¶
Les classes et interfaces de ds s’utilisent dans un espace de nommage Ds:
<?php
$vector = new \Ds\Vector();
$vector->push("un");
$vector->push("deux");
$vector->push("trois", "quatre");
// ...[ , ] = unpacking
$vector->push(...["cinq", "six"]);
print_r($vector);
?>
Exemple d’utilisation de la classe Set¶
Utilisons maintenant concrètement la classe Set.
Question HTML dans un select multiple:¶
Prenons un petit formulaire en HTML qui propose un choix de couleurs dans un select:
<p>Quelles sont les couleurs du maillot des panthères du Fleury Loiret Handball ?
<select name="coul[]" multiple size=5>
<option value="jaune">Jaune
<option value="rose">Rose
<option value="bleu">Bleu
<option value="noir">Noir
<option value="blanc">Blanc
<option value="vert">Vert
</select>
</p>
Réponse PHP avec Collections¶
<?php if (!empty($_GET['coul'])){ $couleursReponse = new \Ds\Set($_GET['coul']); $couleursCorrectes = new \Ds\Set(['rose','noir','blanc']); // Calculons la différence des 2 ensembles et voyons si elle est vide if (($couleursReponse->diff($couleursCorrectes))->isEmpty()) echo "Bravo les couleurs de Fleury Hand Ball sont bien Rose Noir et Blanc !"; else echo "Mauvaise réponse : les couleurs de Fleury Hand Ball sont: Rose Noir et Blanc !"; }
Sans Collections, on utilise les tableaux …
Sans Ds, nous aurions été obligés de nous contenter de tableaux PHP et d’utiliser par exemple la méthode array_diff: Voir : array_diff php
Avec des Arrays:¶
On peut ici s’en sortir avec de simples tableaux PHP en vérifiant que la taille du tableau des réponses données est la même que celle du tableau des bonnes réponses, puis que les contenus de ces tableaux sont identiques.
<?php
if (!empty($_GET['coul'])){
$couleursReponse = $_GET['coul'];
$couleursCorrectes = array(['rose','noir','blanc']);
if (count($couleursReponse) == count($couleursCorrectes) && !array_diff($couleursReponse, $couleursCorrectes))
echo "Bravo les couleurs de Fleury Hand Ball sont bien Rose Noir et Blanc !";
else
echo "Mauvaise réponse : les couleurs de Fleury Hand Ball sont: Rose Noir et Blanc !";
}