Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    35

    Distribuzione risultati da SELECT diverse

    Salve a tutti, sto realizzando un sistema di ricerca che funzioni in maniera simile a quello di Facebook.

    Nel mio sito ho 4 categorie di contenuti e ho preparato un form di ricerca in ajax con suggerimento.

    Il risultato che vorrei è che i suggerimenti non fossero mai più di 8 e che i contenuti fossero equamente proposti a chi effettua la ricerca:


    CATEGORIA1
    -Contenuto 1x
    -Contenuto 1Y
    CATEGORIA2
    -Contenuto 2x
    -Contenuto 2y
    CATEGORIA3
    -Contenuto 3x
    -Contenuto 3y
    CATEGORIA4
    -Contenuto 4x
    -Contenuto 4y

    Ovviamente il problema nasce quando una delle categorie ha meno di due risultati.

    ipotizziamo che la categoria due abbia solo un risultato, la situazione dovrebbe essere questa:


    CATEGORIA1
    -Contenuto 1x
    -Contenuto 1Y
    -Contenuto 1z
    CATEGORIA2
    -Contenuto 2x
    CATEGORIA3
    -Contenuto 3x
    -Contenuto 3y
    CATEGORIA4
    -Contenuto 4x
    -Contenuto 4y


    Quello che io ho pensato di fare, vista la complessità delle select necessarie per ottenere i vari tipi di contenuto (utilizzo Drupal come CMS) è stato:
    - fare 4 select con limit 8
    - contare i risultati di ogni select
    - con un sistema di IF, decidere quanti risultati stampare per ogni select, in base ai risultati delle altre (IL PROBLEMA STA QUI)
    - stampare i risultati con 4 cicli while limitati dai risultati del sistema del punto precedente


    qui posto una porzione di codice funzionante nel medesimo caso, ma in presenza di sole due categorie...

    Codice PHP:

    <?php
    //$num_promoter = COUNT della prima SELECT
    //$num_user = COUNT della seconda SELECT


                    
    if($num_promoter+$num_user <= 8){} else { //tutti i casi in cui la somma sia maggiore di 8
                        
    if($num_user >= && $num_promoter >= 4){
                            
    $num_user 4;
                            
    $num_promoter 4;
                        } elseif(
    $num_user 4){ //se gli UTENTI sono minori di 4
                            
    if($num_promoter 5){
                                
    $num_promoter 8-$num_user;
                            } 
                        } elseif(
    $num_promoter 4){//se i PROMOTER sono minori di 4
                            
    if($num_user 5){
                                
    $num_user 8-$num_promoter;
                            }
                        }
                    }

    ?>

    Questo invece è quello che ho prodotto nel casi di 4 categorie (ovviamente non funziona benissimo)
    Codice PHP:
    if($num_promoter+$num_user+$num_opportunities+$num_events <= 8){} else { //tutti i casi in cui la somma sia maggiore di 8
                        
    if($num_user >= && $num_promoter >= && $num_opportunities >= && $num_events >= 2){
                            
    $num_user 2;
                            
    $num_promoter 2;
                            
    $num_opportunities 2;
                            
    $num_events 2;
                        } elseif(
    $num_user 2){ //se gli UTENTI sono minori di 2
                             
    if($num_promoter+$num_opportunities+$num_events <= 8-$num_user){} else {
                                if(
    $num_opportunities 3){
                                    if(
    $num_events 4){
                                        
    $num_promoter 8-$num_events-$num_opportunities-$num_user;
                                    }                                                                
                                }
                             }
                        } elseif(
    $num_opportunities 2){ //se le OPPORTUNITA' sono minori di 2
                             
    if($num_promoter+$num_user+$num_events <= 8-$num_opportunities){} else {
                                if(
    $num_user 3){
                                    if(
    $num_events 4){
                                        
    $num_promoter 8-$num_events-$num_opportunities-$num_user;
                                    }                                                                
                                }
                             }
                        } elseif(
    $num_events 2){ //se gli EVENTI sono minori di 2
                             
    if($num_promoter+$num_user+$num_opportunities <= 8-$num_events){} else {
                                if(
    $num_user 3){
                                    if(
    $num_opportunities 4){
                                        
    $num_promoter 8-$num_opportunities-$num_events-$num_user;
                                    }                                                                
                                }
                             }
                        } elseif(
    $num_promoter 2){ //se i PROMOTER sono minori di 2
                             
    if($num_events+$num_user+$num_opportunities <= 8-$num_promoter){} else {
                                if(
    $num_user 3){
                                    if(
    $num_opportunities 4){
                                        
    $num_events 8-$num_opportunities-$num_promoter-$num_user;
                                    }                                                                
                                }
                             }
                        }
                    } 

    Mi servirebbe un consiglio per sapere se sto seguendo la strada giusta (è la prima volta che faccio una cosa del genere) o se esiste una soluzione migliore.

    Spero di essermi spiegato bene, grazie a chiunque abbia la pazienza di leggere tutta la mia richiesta

  2. #2
    ciao,
    la tua è una soluzione troppo complicata...

    questo è un tipico problema dove usare un ciclo..
    ad esempio puoi usare un ciclo for che va da 1 a 8 e aggiorna le variabili dei suggerimnti a seconda che ci siano abbsstanza suggerimenti

    ad esempio questo qui non è certo il massimo (l'ho buttato giù al volo) ma è solo per spiegarti il concetto:


    Codice PHP:
    sugg_promoter 0;
    $sugg_user 0;
    $sugg_opportunities 0;
    $sugg_events 0;

    for (
    $i=0$i<=8$i++)
    {

    if (
    $num_promoter>$i$sugg_promoter++;
    if (
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) > break;

    if (
    $num_user>$i$sugg_user++;
    if (
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events)) > break;

    if (
    $num_opportunities>$i$sugg_opportunities++;
    if (
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) > break;

    if (
    $num_event>$i$sugg_events++;
    if (
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) > break;

    alla fine dentro $sugg_promoter, $sugg_user ecc. hai il numnero di suggerimenti da mostrare per ogni categoria...

    cmq ripeto che studiandoci un po' puoi scrivere un ciclo ancora migliore...
    bytez
    PH

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    35
    Penso di aver capito la logica del tuo script!
    Grazie mille... in effetti la tua soluzione è decisamente più lineare della mia

    Provo subito e ti faccio sapere!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    35
    Funziona alla grande!! Grazie ancora!

    Questa è la versione definitiva (il tuo codice restituiva 9 risultati )

    Codice PHP:

                                    $sugg_promoter 
    0
                    
    $sugg_user 0
                    
    $sugg_opportunities 0
                    
    $sugg_events 0
                    
                    for (
    $i=0$i<=8$i++) 
                    {                
                        if (
    $num_user>$i$sugg_user++;   
                        if ((
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) >= 8) break;
        
                        
                        if (
    $num_promoter>$i$sugg_promoter++; 
                        if ((
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) >= 8) break; 
                        
                        if (
    $num_opportunities>$i$sugg_opportunities++;  
                        if ((
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) >= 8) break;
                        
                        if (
    $num_events>$i$sugg_events++; 
                        if ((
    $sugg_promoter+$sugg_user+$sugg_opportunities+$sugg_events) >= 8) break; 
                    } 

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.