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 !";
}