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

    array_unique , dove sbaglio?

    HO questo codice che tramite le espressioni regolari estrapola dei nomi di stato da un sito :
    codice:
    <?php //inserisco la pagina nella variabile
                $page='http://www.futbol24.com/';
                
                //creo un array conposto da tutte le linee della pagina
                $lines = file($page);
    
                //creo unarray vuoto da popolare
                $parole=array();
    
    
                //scorro le linee della pagina
                foreach ($lines as  $testo) {
                    echo 'testo'.$testo;
                    
                    //cerco il testo compreso tra /national e la /
                    preg_match_all('(/national/(.*?)/)', $testo, $ris);
    
                    //controllo se esiste la parola nella riga se esiste metto il risultato nella variabile
                    if(isset($ris[1][0])){
                        $risultato =$ris[1][0];
                    }
                    //se non esiste setto $risultato come null
                    else{
                        $risultato=null;
                    }
                    
    
                    //se risultato è diverso da null 
                    if($risultato!=null){
    
    
    
                  
    
                            //metto il valore nell'array
                        
                            array_push($parole, $risultato);
                            
                        
                    } 
                }
    
                echo 'Prima di array_unique:<br/>';
                print_r($parole);
    
                $result=array_unique($parole);
    
                echo 'Dopo  array_unique:<br/>';
                print_r($result);
    Di fatto la'array parole e result sono la stessa cosa nonostante ci siano dei valori duplicati , perchè ?

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Invece di
    array_push($parole, $risultato);

    prova

    $parole[] = trim($risultato);

  3. #3
    Susami ma non ti capisco array_push mette un valore nell'array , trim elimina gli spazi , forse intendi prima di fare il push di fare il trim o sbaglio?

  4. #4
    *Messaggio eliminato*
    Ultima modifica di ZioLuffio; 04-10-2014 a 16:26 Motivo: Doppione del messaggio successivo

  5. #5
    Quote Originariamente inviata da pippuccio76 Visualizza il messaggio
    Susami ma non ti capisco array_push mette un valore nell'array , trim elimina gli spazi , forse intendi prima di fare il push di fare il trim o sbaglio?
    Quello che Alhazred suggerisce è che possano esserci degli spazi prima e/o dopo le parole e che quindi possano non essere uguali.
    Secondo me invece è l'espressione regolare che non funziona.
    codice:
    (/national/(.*?)/)
    In preg_match e preg_match_all, il pattern deve essere delimitato da / mentre all'inizio e alla fine hai messo ( ).
    Inoltre, (.*?) non ha alcun senso: per come ha scritto tu "può esserci zero o più caratteri qualunque, e ciò può esserci o non esserci". Solitamente basta scrivere (.*), però spesso non funziona perché considera "carattere qualsiasi" anche la / stessa, quindi va esclusa: ([^\/]*)
    Altra cosa, la / è un carattere speciale, quindi devi fare l'escape per indicare che è una / e non un delimitatore: in questo caso, i caratteri speciali devono essere preceduti da \
    Quindi il pattern dovrebbe essere:
    codice:
    /national\/([^\/]*)\//
    Aggiungo che potresti scriverlo un po' meglio e corto il codice (questo è un suggerimento):
    Codice PHP:
    <?php

    $page
    ='http://www.futbol24.com/';

    $lines file($page);

    $parole=array();

    foreach (
    $lines as  $testo) {
        echo 
    'testo'.$testo;

        if(
    preg_match_all('/national\/([^\/]*)\//'$testo$ris)){
            
    $parole array_merge($parole,$ris[1]);
        } 

    }

    echo 
    'Prima di array_unique:<br/>';
    print_r($parole);

    $result=array_unique($parole);

    echo 
    'Dopo  array_unique:<br/>';
    print_r($result);
    (ho tralasciato i commenti)

    Se provassi la mia soluzione e non dovesse funzionare, ti invito a postare i risultati dei print_r
    Ultima modifica di ZioLuffio; 04-10-2014 a 16:32

  6. #6
    Quote Originariamente inviata da ZioLuffio Visualizza il messaggio
    Quello che Alhazred suggerisce è che possano esserci degli spazi prima e/o dopo le parole e che quindi possano non essere uguali.
    Secondo me invece è l'espressione regolare che non funziona.
    codice:
    (/national/(.*?)/)
    In preg_match e preg_match_all, il pattern deve essere delimitato da / mentre all'inizio e alla fine hai messo ( ).
    Inoltre, (.*?) non ha alcun senso: per come ha scritto tu "può esserci zero o più caratteri qualunque, e ciò può esserci o non esserci". Solitamente basta scrivere (.*), però spesso non funziona perché considera "carattere qualsiasi" anche la / stessa, quindi va esclusa: ([^\/]*)
    Altra cosa, la / è un carattere speciale, quindi devi fare l'escape per indicare che è una / e non un delimitatore: in questo caso, i caratteri speciali devono essere preceduti da \
    Quindi il pattern dovrebbe essere:
    codice:
    /national\/([^\/]*)\//
    Aggiungo che potresti scriverlo un po' meglio e corto il codice (questo è un suggerimento):
    Codice PHP:
    <?php

    $page
    ='http://www.futbol24.com/';

    $lines file($page);

    $parole=array();

    foreach (
    $lines as  $testo) {
        echo 
    'testo'.$testo;

        if(
    preg_match_all('/national\/([^\/]*)\//'$testo$ris)){
            
    $parole array_merge($parole,$ris[1]);
        } 

    }

    echo 
    'Prima di array_unique:<br/>';
    print_r($parole);

    $result=array_unique($parole);

    echo 
    'Dopo  array_unique:<br/>';
    print_r($result);
    (ho tralasciato i commenti)

    Se provassi la mia soluzione e non dovesse funzionare, ti invito a postare i risultati dei print_r
    L'espressioni regolare utilizzata fà quello che mi serveed ora modificando questo :

    if(!$duplicato){
    $duplicato=trim($duplicato);
    array_push($parole, $risultato);
    }
    funziona , probabilmente cerano degli spazi che non andavano....

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Quote Originariamente inviata da pippuccio76 Visualizza il messaggio
    Susami ma non ti capisco array_push mette un valore nell'array , trim elimina gli spazi , forse intendi prima di fare il push di fare il trim o sbaglio?
    Anche il codice che ti ho scritto io aggiunge un elemento ad un array ad ogni cilco, fa esattamente la stessa cosa di array_push(), infatti array_push() ad un certo punto del suo codice farà una cosa uguale a quella che ti ho scritto io, la differenza sta esclusivamente nelle performance, chiamare una funzione è più lento che eseguire direttamente un'istruzione.
    Questa cosa non era intesa a risolverti il problema, avrei anche potuto suggerirti più semplicemente array_push($parole, trim($risultato))

    Quello che realmente ti ha risolto il problema è effettivamente il trim(), come immaginavo prima e/o dopo le stringhe c'erano degli spazi che ti facevano saltare l'uguaglianza.

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.