Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [PHP] selezionare i due valori più alti da un array

    Salve a tutti! questo è il mio primo post nel forum, spero possiate aiutarmi, dato che non sono un grande esperto di PHP o di programmazione in generale, ma mi sto avvicinando con molta curiosità a questo mondo.

    Il problema è il seguente: ho inserito un form in una pagina web che propone un questionario con 10 domande a risposta multipla ( 4 possibili risposte per ogni domanda, 4 possibili valori, diciamo A, B, C, D ). Ad ogni risposta data viene incrementato il contatore associato a ciascuno dei valori. Alla fine, viene visualizzato il risultato, che è relativo al contatore col valore più grande. Per far questo trovo il max di un array di variabili contatori che ho definito.
    In caso di un "vincitore assoluto" il codice PHP funziona alla perfezione.
    Mi si pone però un problema logico nel momento in cui voglia prendere in considerazione l'eventualità che non ci sia un vincitore assoluto tra i quattro contatori. Io ho pensato di selezionare in modo random uno dei 4 profili che ho definito come risultato finale, ma questo da un punto di vista logico ha poco senso, perchè potrebbe risultare vincente anche un profilo associato ad un contatore che è rimasto zero.

    C'è modo , nel caso in cui non esista un max assoluto, di:

    - ordinare l'array di contatori dal più piccolo al più grande

    - selezionare solo i valori "primi a parimerito"

    - estrarne in modo random uno solo, tra questi primi a parimerito?

    Spero d'esser stato chiaro, grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Se ho ben capito dovresti selezionare il valore max dei contatori e poi filtrare l'array su tale valore, a quel punto avresti un array di "vincitori" e scegli - se devi - quello che vuoi anche casualmente, p.es.:

    Codice PHP:
    // $contatori = array ('a' => 5, 'b' => 7, 'c' => 7, 'd' => 3) p.es. - questo lo calcoli cmq
    $max max($contatori); // p.es. 7
    $wins array_filter($contatori, function ($elem) use ($max) { $elem==$max; }); // p.es. array('b' => 7, 'c' => 7);
    $win array_rand($wins); // vincitore ... se ce n'è uno cmq è quello 
    ...DA CONTROLLARE...

  3. #3
    mmm così mi ritorna errore proprio sulla riga centrale del codice che mi hai suggerito

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    che errore? può essere un banale errore di sintassi... oppure crea una funzione di filtraggio separata (vedi array_filter).

  5. #5
    Allora ho provato a creare una funzione di filtraggio separata... funziona, ma ho ancora dei dubbi , perchè secondo me c'è qualcosa che non va.. passo a spiegare

    L'array punteggi è composto dalle quattro variabili contatore, diciamo countA, countB, countC, countD:

    Codice PHP:
    $punteggi = array($countA,$countB,$countC,$countD); 
    L'array dei profili è composto da quattro stringhe possibili:

    Codice PHP:
    $profili = array("profiloA","profiloB","profiloC","profiloD"); 
    Essendoci dieci domande con quattro risposte ciascuna, se escludiamo i casi in cui ci sia uno solo dei contatori che come valore ha il massimo assoluto (la condizione del massimo assoluto l'ho realizzata con una if), le uniche possibilità in cui i contatori possono arrivare primi a parimerito (else) sono:

    - quando due contatori hanno punteggio rispettivamente uguale a 4 ( e gli altri due sono entrambi ad 1, oppure uno a 2 e l'altro a 0 )
    - quando due contatori hanno punteggio rispettivamente uguale a 3 ( e gli altri sono entrambi a 2)
    - quando tre contatori hanno punteggio rispettivamente uguale a 3 ( e il quarto è a 1 )

    Per cui ho inserito quanto segue nel corpo dell' else:

    Codice PHP:
    // se c'è un vincitore assoluto imposta vince come il massimo del vettore punteggi

    ..... questa parte funziona bene ......

    //altrimenti estrae a sorte tra i primi a parimerito
    else{

       function 
    maggiore($valore){ 
           if(
    $valore>2){ return TRUE; } 
           else{ return 
    FALSE; }
       } 

       
    $maggiori array_filter($punteggi,"maggiore"); 

       
    $random array_rand($maggiori1); 

       
    $vince$punteggi[$random];
    }

    for(
    $i=0$i<4$i++)
        if(
    $vince == $punteggi[$i]){
                
    $profilo $profili[$i];  //qui si verifica il problema, nel caso di estrazione  random
        



    Per controllare che tutto funzionasse bene davvero ho usato delle print_r per verificare gli indici e i valori estratti dalle varie funzioni applicate agli array.

    Il punto è che se per esempio.. risultano maggiori a parimerito con 4 punti countB (cioè punteggi[1] ) e countC ( cioè punteggi[2] ), applicando il filtro mi ritorna un array che effettivamente contiene:

    Array( [1] => 4 count[2] => 4 )

    Fin qui credo sia tutto regolare.

    Poi... la funzione array_rand se non ho capito male mi restituisce l'INDICE di un elemento estratto a sorte dall'array, giusto? mi ritorna correttamente o 1 o 2 ( l'ho verificato con una print_r($random); ). Nel caso corrente mi ha ritornato:

    1

    Quindi assegno a $vince il valore, ed esce correttamente il valore relativo, 4

    Il problema si verifica nel momento in cui dico $profilo = $profili[$i]; perchè se verifico la cosa con un print_r($profilo) , mi escono SIA profiloB che profiloC .. =/

    ( non so se sono stato chiaro chiedo scusa sono alle prime armi )

  6. #6
    Ho risolto !!!

    Codice PHP:
    else{ 
      function 
    maggiore($valore){ 
          if(
    $valore>2){ return TRUE; } 
          else{ return 
    FALSE; } 
       } 
       
       
    $maggiori array_filter($punteggi,"maggiore"); 
       
    $random array_rand($maggiori); 

       for(
    $i=0$i<4$i++) 
          if(
    $random == $i){ 
             
    $profilo $profili[$i];
       }


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 © 2024 vBulletin Solutions, Inc. All rights reserved.