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

    funzione più rapida per scomporre fstringa in parole

    partendo da una stringa di questo tipo

    Codice PHP:
    $s "\t\tciao\t\t\t         \tcome     va\t\r\n"
    secondo voi qual'è la funzione più semplice e/o veloce per scomporla in un vettore del tipo

    Array(
    0 => ciao
    1 => come
    2 => va
    )

    avevo pensato ad una cosa tipo

    Codice PHP:
    $s trim($s); // toglie \r \n \t in cima e in fondo

    $s str_replace("\t"" "$s); // sostituisco spazi ai tab

    $arr1 explode(" "$s);

    $arr_finale = array();

    foreach(
    $arr1 as $val)
    {
      if(
    $val != '')
      {
       
    $arr_finale[] = $val;
      }

    e in $arr_finale ho solo "ciao", "come", "va"

    ma mi sembra un pò pesantuccia ...

  2. #2
    Codice PHP:
    $parole split("[[:space:]]"$s); 
    <?php echo ' Emiliano Gabrielli (aka AlberT) ',"\n",
    ' socio fondatore e membro del direttivo del GrUSP ',"\n",
    ' AlberT_at_SuperAlberT_it - www.SuperAlberT.it ',"\n",
    ' IRC: #php,#AES azzurra.com ',"\n",'ICQ: 158591185'; ?>

  3. #3
    alla faccia della compattezza!

    però leggo che split() usa espressioni regolari, non è molto performante se la devo usare su molte stringhe (= righe di file di testo).

    molte grazie AlberT

  4. #4
    se non mi ricordo male usa pregexp .. e poi è sicuramente moooooooolto + performante di qualsiasi cosa ti inventi tu in PHP (lei è in C :-P )
    <?php echo ' Emiliano Gabrielli (aka AlberT) ',"\n",
    ' socio fondatore e membro del direttivo del GrUSP ',"\n",
    ' AlberT_at_SuperAlberT_it - www.SuperAlberT.it ',"\n",
    ' IRC: #php,#AES azzurra.com ',"\n",'ICQ: 158591185'; ?>

  5. #5
    c'hai ragione, fatto benchamrk e ci mette la metà VVoVe:

  6. #6
    http://it.php.net/manual/en/function.preg-split.php
    dovrebbe essere ancora + performante
    Codice PHP:
    $parole preg_split('/\s+/'$s); 
    <?php echo ' Emiliano Gabrielli (aka AlberT) ',"\n",
    ' socio fondatore e membro del direttivo del GrUSP ',"\n",
    ' AlberT_at_SuperAlberT_it - www.SuperAlberT.it ',"\n",
    ' IRC: #php,#AES azzurra.com ',"\n",'ICQ: 158591185'; ?>

  7. #7
    Frankesk se fai delle prove ci confermi che preg_split è + veloce

  8. #8
    ci sono belle e brutte notizie. intanto posto il codice dei benchmark, li ho eseguiti tramite CLI, non tramite web:

    Codice PHP:
    function _getmicrotime()
    {
        list(
    $usec$sec) = explode(" "microtime()); 
        return ((float)
    $usec + (float)$sec); 
    }

    function 
    f1($s)
    {
        
    $s trim($s); // toglie \r \n \t in cima e in fondo

        
    $s str_replace("\t"" "$s); // sostituisco spazi ai tab

        
    $arr1 explode(" "$s);

        
    $arr_finale = array();

        foreach(
    $arr1 as $val)
        {
          if(
    $val != '')
          {
           
    $arr_finale[] = $val;
          }
        }

        return 
    $arr_finale;
    }

    function 
    f2($s)
    {
        return 
    split("[[:space:]]"$s);
    }

    function 
    f3($s)
    {
        return 
    preg_split('/s+/'$sPREG_SPLIT_NO_EMPTY);
    }

    $start _getmicrotime();
    for(
    $i=0$i<5000$i++)
    {
    //    custom()
    //    $arr = f1("\t\tciao\t\t\t         \tcome     va\t\r\n");

    //    split()
    /*    $tmp = f2("\t\tciao\t\t\t         \tcome     va\t\r\n");
        $arr = array();
        foreach($tmp as $val)
        {
            if($val != '')
            {
                $arr[] = $val;
            }
        }*/

    //    preg_split()
        
    $arr f3("\t\tciao\t\t\t         \tcome     va\t\r\n");
    }
    $elapsed _getmicrotime() - $start;
    echo 
    "secs : ".$elapsed."\r\n";

    print_r($arr); 
    su un tot di campioni:

    la funzione custom: 0.184 ms
    split(): 0.233 ms
    preg_split(): 0.02 ms

    però... ci sono dei però.

    la custom, (f1), fa tutto quello che deve fare, spazi e \t, e resituisce un array con le sole 3 parole, non con stringhe vuote.

    la split, (f2), sarebbe più veloce se non fosse che se trova \t\t\t splitta tutto e ottengo anche stringhe vuote che devono essere rimosse.

    la preg_split, (f3), è velocissima ma... non sono riuscito a farla funzionare perchè non conosco la sintassi delle espressioni regolari da dargli e quella postata non funziona c'è di buono che la preg_split() è in grado anche di rimuovere stringhe vuote da sola con PREG_SPLIT_NO_EMPTY.

    risultato: se si riesce a mettere assieme la expressione regolare per la preg_split, dovrebbe essere la migliore, FORSE.

  9. #9
    Originariamente inviato da bubu77
    Frankesk se fai delle prove ci confermi che preg_split è + veloce
    te lo posso confermare io, ho fatto prove tanto tempo fa su regexp di diversa complessità (da 1 a centinaia di caratteri di regexp) e le pcre battono le posix, ma ovviamente le string* di php senza regexp sono moooooolto più veloci.

    ciao,
    jack.

  10. #10
    Originariamente inviato da mdsjack
    te lo posso confermare io, ho fatto prove tanto tempo fa su regexp di diversa complessità (da 1 a centinaia di caratteri di regexp) e le pcre battono le posix, ma ovviamente le string* di php senza regexp sono moooooolto più veloci.

    ciao,
    jack.
    non dubitavo

    a me interessava avere un raffronto sui tempi

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.