Expert : Multi-catégorisation via logique binaire

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Xophe, 17 Février 2009.

  1. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    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.
     
  2. moktoipas
    moktoipas WRInaute passionné
    Inscrit:
    29 Juin 2004
    Messages:
    1 495
    J'aime reçus:
    0
    bon c'etait un brouillon :D
     
  3. moktoipas
    moktoipas WRInaute passionné
    Inscrit:
    29 Juin 2004
    Messages:
    1 495
    J'aime reçus:
    0
    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
     
  4. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    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.
     
  5. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    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.
     
  6. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    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
     
  7. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    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
     
  8. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    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.
     
  9. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    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.
     
Chargement...
Similar Threads - Expert Multi catégorisation Forum Date
Google achète PeakStream : Experts programmation multicoeur Google : l'entreprise, les sites web, les services 6 Juin 2007
Avis aux experts webmarketing BtoB : demande de conseil Demandes d'avis et de conseils sur vos sites 8 Mars 2022
Format des URL : des experts SEO ne respectent pas le silo Référencement Google 29 Août 2019
[pour les experts] Zentao Développement d'un site Web ou d'une appli mobile 24 Août 2019
Comment utiliser la balise <link rel="amphtml" / mode expert Crawl et indexation Google, sitemaps 25 Octobre 2018
Avis aux experts webmarketing BtoB : demande de conseil Le café de WebRankInfo 1 Octobre 2018
Possible de fixer le Serial number DNS avec l'interface Gandi expert ? Administration d'un site Web 13 Février 2017
Quel livre pour devenir un expert en SEO? Débuter en référencement 10 Décembre 2016
L'IA de Google sait mieux lire sur les lèvres que les experts humains Google : l'entreprise, les sites web, les services 24 Novembre 2016
Un expert Google Tag Manager pour m'aider ? Google Analytics 30 Avril 2016
Expert en référencement, c'est quoi ? Le café de WebRankInfo 26 Octobre 2015
Avis d'experts sur le netlinking (liens bas de pages etc...) Netlinking, backlinks, liens et redirections 3 Novembre 2014
Expertise sur un site de 3 mois Problèmes de référencement spécifiques à vos sites 7 Février 2014
Besoin de votre expertise : filtre Google Débuter en référencement 12 Novembre 2013
Appel aux experts de chez Google, est-ce normal ? Référencement Google 10 Octobre 2013
Votre avis d'expert sur Concept Outils Demandes d'avis et de conseils sur vos sites 6 Août 2013
Question pour un expert SEO: Rel=”Canonical” pour mulitlingue? Référencement international (langues, pays) 24 Juin 2013
besoin d'un oeil d'experts Débuter en référencement 2 Mars 2013
Avis d'expert Problèmes de référencement spécifiques à vos sites 7 Février 2013
Questions aux Experts Problèmes de référencement spécifiques à vos sites 28 Janvier 2013