Générateur de combinaisons

Lorsque j'ai travaillé sur la navigation à facettes, il a fallu mettre en place un système d'url rewriting. La navigation à facettes permet de filtrer des produits d'un catalogue en fonction d'un certain nombre de critères. Par exemple, l’ensemble des produits rouges et verts de taille XL. L'url ressemble alors à /couleur-rouge-vert/taille-xl. Devant le nombre d'url possible, j'ai abandonné l'idée de stocker en base de données l'ensemble des combinaisons possibles. Malgré tout, je me suis penché sur l'algorithme pour générer toutes les combinaisons possibles à partir d'une liste de valeurs. Je vous propose donc ce dernier.

  1. <?php
  2. // Liste des valeurs possibles
  3. $values = array(0, 1, 2, 3);
  4.  
  5. // Nombre de valeur possible
  6. $count = count($values);
  7.  
  8. // Nombre de combinaison
  9. $nbValues = pow(2, $count);
  10.  
  11. // Conteindra l'ensemble des combinaisons possibles
  12. $combinations = array();
  13.  
  14. for($i = 1; $i < $nbValues; $i++)
  15. {
  16. // On tranforme le numéro de la combinaison en masque binaire
  17. // Chaque "bit" permettent de sélectionner ou non une valeur
  18. // Par exemple si le masque vaut 0001, alors la combinaison sera : 3
  19. // Si le masque vaut 1010, alors la combinaison sera : 0, 2.
  20. $mask = decbin($i);
  21.  
  22. // Liste des valeurs de la combinaison
  23. $combination = array();
  24.  
  25. // On parcourt les bits du masque un à un
  26. // str_pad permet de le sufixer avec des 0
  27. // str_split transforme la chaine de $count elements en tableau
  28. foreach(str_split(str_pad($mask, $count, '0', STR_PAD_LEFT)) as $id => $selected)
  29. if($selected) // Si le bit vaut "1" alors on ajoute la valeur dans la combinaison
  30. $combination[] = $values[$id];
  31.  
  32. // On ajoute la combinaison dans la liste des combinaisons
  33. $combinations[] = $combination;
  34. }

Piste d'amélioration

Avec des listes de valeurs plus importantes, il est certainement souhaitable de ne pas stocker les combinaisons dans un tableau mais d’effectuer les traitements directement dans la boucle for. De même, il est très facile de stopper cet algorithme en cours de route (quand il prend trop de mémoire ou que le temps d'exécution est trop long) pour le reprendre après. Personnellement j'ai tendance à limiter mes algorithmes à 5 secondes d’exécution s'ils sont trop longs en les fractionnant. Pour cela il faut grâce à script bach ou à une requête ajax exécuter en boucle l'algorithme en lui attribuant la valeur d'initialisation du $i dans la boucle for afin de reprendre là où il s'est arrêté.

 
1. Le
29 janv.
2013
15h50
par soluc

Bonjour, concernant le module à facettes, dans ma version 1.4.6.2, je rencontre le problème suivant : l'organisation de mes catégories en BO (Ordre des produits, ajout, suppression...) n'est plus prise en compte en boutique- reste figée depuis activation bloc à facettes. Désolé si ce n'est pas le bon endroit pour mon problème, mais je n'ai toujours pas eu de réponse ...D'avance merci

2. Le
4 juil.
2015
03h58
par zouloo57

SVP, j'ai besoin d'une liste complet de combinaisons à 4 chiffres de 0123 à 9876 sans jamais avoir de numéros qui se répêtes dans la même combinaison telle que ; 7764 ou 4454 ou encore 0196 ou 0169. Pourriez vous m'aider, merci !

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

À propos

Photographie

Maxence de Flotte

Développeur cœur PrestaShop

Passionné de nouvelles technologies

PHP, HTML5/CSS3, jQuery, Bootstrap, LESS CSS, ...

Voir mon CV

Mes projets