Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    Contare quanti click ha fatto un indirizzo

    Ciao a tutti ragazzi
    sono diversi giorni che mi rompo la testa su questo esercizio.
    Non ce la faccio più spero in un vostro aiuto.

    Nel file test.txt ho una lista del genere

    codice:
    p1|26/07/16|127.0.0.1|12:40:17
    p2|26/07/16|127.0.0.1|12:40:19
    p2|26/07/16|127.0.0.1|12:40:21
    p2|26/07/16|127.0.0.1|12:40:22
    p1|26/07/16|127.0.0.1|12:40:24
    p2|26/07/16|127.0.0.1|12:30:18
    p1|26/07/16|188.114.103.34|12:30:21
    p1|26/07/16|173.245.56.233|12:30:23
    p2|26/07/16|173.245.54.238|12:30:25
    p1|26/07/16|188.114.103.34|12:33:23
    p1|26/07/16|188.114.103.34|12:33:26
    p2|26/07/16|188.114.103.34|12:33:28
    p1|26/07/16|188.114.103.34|12:51:24
    p2|27/07/16|173.245.56.233|06:00:37
    p2|27/07/16|173.245.54.238|06:00:37
    p1|27/07/16|173.245.63.234|06:00:38
    p1|27/07/16|173.245.54.234|06:00:38
    p2|03/08/16|173.245.54.238|06:01:51
    p1|03/08/16|173.245.54.234|06:01:51
    p2|03/08/16|173.245.56.233|06:02:26
    p1|03/08/16|173.245.63.234|06:02:27
    p2|03/08/16|162.158.104.227|13:15:08
    p1|03/08/16|162.158.104.227|13:28:53
    p1|06/08/16|127.0.0.1|12:36:42
    p2|06/08/16|127.0.0.1|12:36:47
    p2|09/08/16|127.0.0.1|15:16:11
    p1|09/08/16|127.0.0.1|15:17:52
    p2|09/08/16|127.0.0.1|15:18:19
    p1|09/08/16|127.0.0.1|15:18:21
    in cui p1 e p2 sono i tasti cliccati dagli utenti.
    Sono riuscito a calcolare il numero totale di click su p1 e su p2, ma voglio conoscere ogni indirizzo ip quanti click ha fatto su p1 e quanti su p2.

    Non so quale sia meglio come logica di pensiero e spero in un vostro aiuto in tal senso: ho iniziato con l'usare un semplice ciclo while per poter arrivare al risultato; poi mi è venuto in mente che potessi utilizzare anche una funzione che scorra anche lei il file test.txt. ma cmq non ci riesco.

    La cosa fondamentale che mi interesse è come devo muovere il cervello per tentare di risolvere problemi del genere e perchè.

    Questo è il mio codice:

    forse ci sono un po' troppi echo ma volevo rendermi conto



    codice:
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Conto il numero di click</title>
    </head>
    <body>
    
    
    <h3>Conto il numero di click</h3>
    
    
    <?php 
    $i=$nump1=$nump2='0';
    
    
    $indirizzo_pres=$indirizzo_pres2=$indirizzo_div=$totclicpres1=$totclicpres2=$totclicdiv1=$totclicdiv2='0';
    $indirizzop1='0';
    $indirizzop2='0';
    $indirizzo_trovato1=$indirizzo_trovato2='0';
    
    
    
    
    
    
    $textfile = fopen("test.txt", "r"); //apro il file da contare
    
    
    
    
    while ( $rigafile=fgets($textfile,1024) ) {
        $campiriga = explode("|", $rigafile); //estraggo tutti i campi di riga
        $click=$campiriga[0]; //prelevo da ogni riga il campo relativo al click
        $indirizzo1=$campiriga[2]; //prelevo da ogni riga il campo relativo all'indirizzo
    
    
        if(isset($indirizzo1)){  /*conteggio il numero di click totali sui due pulsanti*/
            if($click== "p1"){$nump1=$nump1+1; $i++;$indirizzop1=$indirizzo1;}
    
    
            if($click=="p2"){$nump2=$nump2+1;$i++;$indirizzop2=$indirizzo1;}
        }
        if($indirizzop1<>$indirizzop2){
            $indirizzo_trovato1=$indirizzop1;
            $indirizzo_trovato2=$indirizzop2;
        }
        quanti_click($indirizzo1,$indirizzop1,$indirizzop2);
    
    
    
    
    }//----------------chiudo while----------------------------------
    
    
    echo"<br>il numero di click totale su p1 è".$nump1 ;
    echo"\n<br>il numero di click totale su p2 è".$nump2;
    echo"<br>ccccccc$indirizzo_div<br>";
    echo"<br>$indirizzo1<br>";
    
    
    
    
    echo"<br>l'indirizzo  $indirizzo_pres ha fatto questi click sul primo $totclicpres1\n" ;
    echo"<br>l'indirizzo  $indirizzo_pres ha fatto questi click sul secondo $totclicpres2\n" ;
    
    
    echo"<br>l'indirizzo  $indirizzo_pres2 ha fatto questi click sul primo $totclicdiv1\n" ;
    echo"<br>l'indirizzo  $indirizzo_pres2 ha fatto questi click sul secondo $totclicdiv2\n" ;
    
    
    
    
    /*-----------------FUNZIONE----------------------------*/
    
    
    function quanti_click($indirizzo,$indirizzo_sceltap1,$indirizzo_sceltap2){
        
    global    $indirizzo_pres;    
    global    $indirizzo_pres2;    
    global    $totclicpres1;    
    global    $totclicpres2;
    global $totclicdiv1;
    global $totclicdiv2;
    global $indirizzo_div;
    $indirizzo_pres=$indirizzo_pres2=$indirizzo_div='0';
    $totclicpres1=$totclicpres2=$totclicdiv1=$totclicdiv2='0';
    
    
    
    
    
    
    
    
        $textfile = fopen("test.txt", "r"); //apro il file da contare
        
        
        while ( $rigafile=fgets($textfile,1024) ) {
            $campiriga = explode("|", $rigafile); //estraggo tutti i campi di riga
            $click=$campiriga[0]; //prelevo da ogni riga il campo relativo al click
            $ind=$campiriga[2]; //prelevo da ogni riga il campo relativo all'indirizzo
        
                if(($indirizzo_sceltap1==$ind)){
                    
                        if($click=="p1"){$totclicpres1=$totclicpres1+1;
                        $indirizzo_pres1=$indirizzo_sceltap2;}                    
                }else{
                    $totclicdiv1=$totclicdiv1+1;
                    $indirizzo_pres2=$indirizzo_sceltap2;
                }
        
            
                if($indirizzo_sceltap2==$ind){
                    
                    if($click=="p2"){$totclicdiv2=$totclicdiv2+1;
                    $indirizzo_pres=$indirizzo_sceltap2;
                    }
                    
                }    else{$totclicdiv2=$totclicdiv2+1;
                $indirizzo_pres2=$indirizzo_sceltap2;}
        
            
            
            
            
            
    
    
        }//----------------chiudo while----------------------------------
        
    }//chiudo funzione
    
    
    ?>
    
    
    </body>
    </html>



    La funzione quanti_click() aveva in precedenza anche quest'altra forma, ma cmq non dava i risultati sperati
    codice:
    function quanti_click($indirizzo){
    
    
    
    
        //definisco la variabili contatore
        
        global $totclicpres1;     //$totclicpres1='0';
        global $totclicpres2;    //$totclicpres2='0';
        
        global $totclicdiv1;     //$totclicdiv1='0';
        global $totclicdiv2;    //$totclicdiv2='0';
        global $indirizzo_pres2;
        global $indirizzo_pres3;
        
        
        global $indirizzo_pres;
        global $indirizzo_div;
        global $click;
        global $totclicdivvvv1;
        global $totclicdivvvv2;
        global $i;
        global $condizione1;
        
        $textfile = fopen("test.txt", "r");
        while ($rigafile=fgets($textfile,1024) ) {
                    
            $campiriga = explode("|", $rigafile);
            $ind=$campiriga[2];  //stesso indirizzo del while fuori funzione
        $i=0;
        
        
        if($indirizzo==$ind){$indirizzo_pres=$indirizzo;}
        if($indirizzo<>$ind){$indirizzo_pres2=$indirizzo;}
        
            if($indirizzo_pres){
                if($click=="p1"){$totclicpres1=$totclicpres1+1;}
                if($click=="p2"){$totclicpres2=$totclicpres2+1;}
                }
        
            if($indirizzo_pres2){
                if($click=="p1"){$totclicdiv1=$totclicdiv1+1;}
                if($click=="p2"){$totclicdiv2=$totclicdiv2+1;}            
            }
        }//chiudo while---------------------------------
        fclose($textfile);
        
    }//chiudo funzione--------------------------------------------------
    Ultima modifica di Alfoxx; 11-08-2016 a 17:00

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,105
    Io farei così
    Codice PHP:
    <?php
    // conterrà un elemento per ogni indirizzo che
    // ha cliccato sul pulsante p1
    $pulsante1 = array();

    // conterrà un elemento per ogni indirizzo che
    // ha cliccato sul pulsante p2
    $pulsante2 = array();

    // la variabile contenente il contatore del pulsante
    // la passo per riferimento, così la posso modificare
    // all'interno della funzione
    function quanti_click( &$pulsante$ip )
    {
        
    // se nell'array c'è già l'indirizzo dell'utente che sto considerando
        
    if ( array_key_exists($ip$pulsante) )
        {
            
    // aggiungo 1 click all'indirizzo
            
    $pulsante[$ip] += 1;
        }
        else
        {
            
    // altrimenti aggiungo un nuovo elemento all'array
            // la chiave dell'elemento è l'indirizzo
            // il valore è il numero di click
            
    $pulsante[$ip] = 1;
        }
    }
    ?>

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Conto il numero di click</title>
    </head>
    <body>

    <h3>Conto il numero di click</h3>

    <?php 

    $textfile 
    fopen("test.txt""r"); //apro il file da contare

    while ( $rigafile=fgets($textfile,1024) ) 
    {
        
    $campiriga explode("|"$rigafile); //estraggo tutti i campi di riga
        
        
    $pulsante $campiriga[0]; //pulsante premuto
        
    $indirizzo $campiriga[2]; //indirizzo dell'utente

        
    if ( $pulsante == 'p1' )
        {
            
    quanti_click$pulsante1$indirizzo );
        }
        else if ( 
    $pulsante == 'p2' )
        {
            
    quanti_click$pulsante2$indirizzo );
        }
    }

    foreach ( 
    $pulsante1 as $key => $value )
    {
        echo 
    "L'indirizzo $key ha cliccato $value volte sul pulsante 1<br>";
    }

    foreach ( 
    $pulsante2 as $key => $value )
    {
        echo 
    "L'indirizzo $key ha cliccato $value volte sul pulsante 2<br>";
    }
    ?>
    </body>
    </html>
    Ultima modifica di Alhazred; 11-08-2016 a 17:41
    Earth2: 3QCNSPFQUH

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie infinite per la tua tempestività....
    l'idea (sfruttare un array di appoggio per gli indirizzi) mi era venuta anche a me però non sapevo implementarla bene

    Ma non sono in grado di comprenderlo, mi spiego pr ora mi sono saltati queste tre cose all'occhio:

    - il passaggio per riferimento non l'ho affrontato nei miei corsi php.

    -questo comando array_key_exists($ip, $pulsante)
    è una funzione predefinita di php , giusto? cosa controlla ricevendo $ip e $pulsante? l'indirizzo ip ($ip) in base al pulsante cliccato ($pulsante)?

    quindi in definitiva controllo il primo campo sulla base del secondo campo di un array?

    - quando usi il ciclo foreach hai usato dopo as $key; cosa è questa $key? la puoi chiamare così all'improvviso?

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,191
    puoi anche fare una cosa più compatta, usando l'operatore ternario

    Codice PHP:
    <?php

    $data 
    = array();

    $handle fopen("input.txt""r");

    while (
    $row fgets($handle)) {
        
    $fields explode("|"$row);
        
    $button $fields[0];
        
    $ip $fields[2];

        !
    array_key_exists($ip$data) ? $data[$ip][$button] = $data[$ip][$button] += 1;

    }

    foreach(
    $data as $ip => $values) {
        foreach (
    $values as $key => $value) {
            
    $sum[$key] += $value;
            echo 
    "$ip ha cliccato $value volte il tasto '$key' \n";
        }

    }

    echo 
    "Click totali:";
    foreach(
    $sum as $key => $value) {
        echo 
    "Click totali su '$key': $value \n";
        
    $totale += $value;
    }

    echo 
    "Totale click: $totale";

    echo 
    "\n";
    ?>

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Ciao Clasku anche a te , infinite grazie.

    giustamente avendo molta più pratica e conoscendo più escamotage, avete entrambi utilizzato tecniche simili ma più elevate
    ovviamente cercherò di capire qualcosa in più, ma ci vuole tempo


    EDIT: pensandoci un po' su, ma esisterebbe anche un metodo senza usare l'array?
    o cmq vado a sbattere con qualcosa di irrisolvibile se non li uso?
    Ultima modifica di Alfoxx; 11-08-2016 a 19:23

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    112
    Io personalmente userei una pagina php di gateway (es: check.php). In altre parole l'utente clicca su un link. Il link accede alla pagina check.php che elabora le statistiche (provenienza ip, pagina etc) e quindi reindirizza alla pagina di destinazione. I dati grezzi acquisiti li salverei in un db pronti per essere elaborati.


    Chiedo scusa.
    Avendo il file di destinazione nel formato dato basta identificare il separatore di campo e quindi agendo sulle stringhe rilevare i separatori esterni al campo interessato e fare la copia della stringa interna ai due separatori, inserendo dinamicamente il dato in una lista dinamica in cui al campo IP è presente anche il campo CLICK che inizialmente settato a 0, verrà incrementato di una unità ogni qualvolta viene rilevata la stringa esistente.
    Prima avevo capito un altra cosa, ossia come rilevare i click su un link da una pagina web. Mi scuso nuovamente.

    PS: Da non trascurare anche le espressioni regolari che nel ambito delle stringhe sono piuttosto potenti:
    - http://php.net/manual/en/function.preg-match.php
    Ultima modifica di semplice77; 11-08-2016 a 20:10

  7. #7
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,191
    Senza usare un array si può anche fare, basta usare un database nel quale inserire i dati dopo aver elaborato il file di testo e poi farci le query (un po' quello che suggerisce semplice77)

    Però gli array bisogna conoscerli e usarli, una volta presa confidenza (non ci vuole poi molto...) ti accorgi della loro utilità

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    112
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Senza usare un array si può anche fare, basta usare un database nel quale inserire i dati dopo aver elaborato il file di testo e poi farci le query (un po' quello che suggerisce semplice77)

    Però gli array bisogna conoscerli e usarli, una volta presa confidenza (non ci vuole poi molto...) ti accorgi della loro utilità
    Esattamente. E' necessario conoscere a fondo gli array.

  9. #9
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,105
    Quote Originariamente inviata da Alfoxx Visualizza il messaggio
    ...
    -questo comando array_key_exists($ip, $pulsante)
    è una funzione predefinita di php , giusto? cosa controlla ricevendo $ip e $pulsante? l'indirizzo ip ($ip) in base al pulsante cliccato ($pulsante)?

    quindi in definitiva controllo il primo campo sulla base del secondo campo di un array?
    Sì, è una funzione nativa di PHP: link
    Consulta sempre la documentazione quando incontri una funzione che non conosci, ci trovi tutte le informazioni.

    array_key_exists($ip, $pulsante)
    controlla se nell'array $pulsante (che in questo caso sarà $pulsante1 o $pulsante2 a seconda di quale gli viene passato dalla chiamata a quanti_click() ) c'è un indice uguale al contenuto di $ip, quindi se c'è un indice uguale all'indirizzo che si sta valutando.

    - quando usi il ciclo foreach hai usato dopo as $key; cosa è questa $key? la puoi chiamare così all'improvviso?
    foreach() può essere usato in due modi:

    1) foreach($array as $value)
    in questo caso si cicla sull'array $array e si prende il valore di ogni elemento, chiaramente $value puoi chiamarla come vuoi, anche $pippo o $xyz o qualsiasi nome valido

    2) foreach($array as $key => $value)
    in questo caso si prende in considerazione anche l'indice di ogni elemento durante il ciclo, l'indice dell'elemento corrente viene messo nella variabile $key, il valore nella variabile $value
    come per il primo caso per i nomi delle variabili puoi metterci quello che vuoi, solo il nome dell'array è vincolato all'array su cui vuoi ciclare, quindi anche
    foreach($array as $frittata => $ombrello)
    è valido, basta che ti ricordi tu cosa sia $frittata e cosa sia $ombrello
    Ultima modifica di Alhazred; 11-08-2016 a 23:57
    Earth2: 3QCNSPFQUH

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,105
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Senza usare un array si può anche fare, basta usare un database nel quale inserire i dati dopo aver elaborato il file di testo e poi farci le query (un po' quello che suggerisce semplice77)

    Però gli array bisogna conoscerli e usarli, una volta presa confidenza (non ci vuole poi molto...) ti accorgi della loro utilità
    Sì, con un database sarebbe molto più semplice, ma a disposizione ha un file di testo.
    Earth2: 3QCNSPFQUH

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