Expert : Multi-catégorisation via logique binaire

WRInaute discret
Bonjour,

admettons que je dispose d'un chiffre codé en binaire sur 8 bits 00000000 (stocké sous la forme 0 en BDD)
Dans la logique de mon application, je souhaite que si tous les bits sont à 0, cela signifie alors que ma fiche produit ne doit pas s'afficher du tout.

Par contre, si le chiffre en binaire est 00000011 (stocké 3 dans la BDD), alors je souhaite que mon application affiche le produit sur les pages 1 et 2 (en effet, les deux derniers bits sont à 1). Dans la même logique, si le chiffre en binaire est 00000010 (=2 en décimal) alors je n'affiche le produit que sur la page 2.

Il me semble qu'il existe des astuces PHP avec l'opérateur >> pour pouvoir créer les deux fonctions suivantes:
A: je communique à la fonction le no de ma page et cette fonction m'indique en retour les entiers pour lesquels je peux afficher le produit. Par ex, pour la page 1, je peux afficher les produits qui ont un chiffre binaire: 1, 3, etc.
B: je communique à la fonction l'entier (qui représente le binaire) et le no de la page et cette fonction m'indique en retour si oui ou non le produit doit être affiché sur cette page.

Avez-vous une idée de la manière d'écrire ces fonctions svp ?

Difficile d'être clair dans mes explications. Merci de votre aide.
 
WRInaute passionné
tu peux meme faire plus simple puisque tu ne veux pas la valeur pour toutes les pages

param de ta fonction : nb= le nombre pg=la page à tester (de 1 à 8 )

function affichesurpage($nb,$pg)
{
return (floor($nb/bcpow('2', $pg, 2))%2==1);
}

CECI EST UNE REPONSE A LA QUESTION B
 
WRInaute accro
Je crois que la réponse ne va pas avec la question...

Je pense que ce que Xophe veut, c'est tout bêtement avoir les articles qui vont avec chaque page en fonction du bitmap associé.

Pas compliqué:

select * from table where bitmap & (1 << (numero_de_page-1))

Ceci dit, si la table grossit un peu, c'est clairement pas optimal du tout, vu que l'ensemble de la table doit être parcouru pour trouver les lignes adéquates, et il n'y a pas de façon pratique d'indexer ça. Il vaudrait mieux avoir une deuxième table qui fait les associations page/article. Ca prend un peu plus de place en base, mais avec les index qui vont bien c'est nettement plus rapide si la base devient un tant soit peu conséquente.

Evidemment si tu veux "strictement" les réponses à tes questions:
A: retourne forcément 2^(nombre total de pages - 1) valeurs différentes. La méthode la plus simple est probablement de générer toutes les valeurs de 0 à 2^(nombre total de pages) et de ne garder que les valeurs qui réuississent le test (valeur & (1<<(page -1)).

B: return $valeur & (1 << ($page-1))

Mais je pense que c'est encore moins optimal si à la base les infos viennent de la bdd.

Jacques.
 
WRInaute accro
Ah, et ajoutons que le fait d'utiliser un bitmap limite évidemment le nombre de pages à la taille du bitmap, a priori 32 bits (donc 32 pages). Une table d'association et une petite jointure sont donc fortement recommandées!

Jacques.
 
WRInaute discret
OK. Merci pour ces premières pistes de réponses. Il va me falloir un peu de temps pour digérer ça ;-)

Je vous tiens au courant.

Merci beaucoup de votre aide
 
WRInaute discret
Bonjour à tous,

un peu tardivement, voici la méthode que j'ai employée.

Aux différentes page sont associées les valeurs suivantes :
- $page_1 = 1 << (1-1) ;
- $page_2 = 1 << (2-1) ;
- $page_3 = 1 << (3-1) ;

A chaque page est associé un entier qui traduit la position du bit 1.
Page 1 : 0001 = 1
Page 2 : 0010 = 2
Page 3 : 0100 = 4
Page 4 : 1000 = 8

Ensuite, en SQL, pour déterminer tous les produits à afficher sur la page 2 :
... WHERE pages & $page_2

J'ai trouvé de l'inspiration sur :
http://www.php.net/manual/fr/language.operators.bitwise.php
http://dev.mysql.com/doc/refman/5.0/fr/bit-functions.html
et
http://www.siteduzero.com/tutoriel-3-32351-introduction-aux-operateurs ... -bits.html
 
WRInaute accro
Tu as lu les problèmes de performances liés à cette approche que j'évoquais? J'ajoute qu'évidemment, ton nombre de pages se trouve limité au nombre de bits dans ton bitmap, probablement 32...

Jacques.
 
WRInaute discret
Bonjour Jacques,

dans mon exemple, je parle de produits et de pages. En réalité, il s'agit de produits que j'affiche chez des boutiques partenaires ou non. Par conséquent, 32 est une limite acceptable. Sachant d'ailleurs, que je stocke en fait l'entier en BIGINT donc 64 bits.

Au niveau performance, je ne détecte rien de particulier "à l'oeil" mais je n'ai pas non plus fait de benchmark très précis.
 
Discussions similaires
Haut