Visualizzazione dei risultati da 1 a 8 su 8

Discussione: gestione coda

  1. #1
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227

    gestione coda

    Salve a tutti. Sto facendo un semplice crawler in php e ho un piccolo problema. I link che trovo vengono inseriti in coda ad un vettore mentre il link appena visitato viene rimosso dallo stesso. Ho però un errore di cui non capisco il motivo: quando faccio $queue = array_shift($coda), la $coda viene vista come stringa e non come vettore, quindi tutte le iterazioni successive, ovviamente, non funzionano. Ecco il codice
    codice:
    <?php
     // prendo una pagina seme e ne trovo i link. A questo punto prendo tali link e li uso come pagine seme.  
    function LeggiUrls($url,$coda) { 		
             $file = 'link.txt'; 	    
             $html = file_get_contents($url); 		
             file_put_contents($file,"".PHP_EOL."pagina analizzata: ".$url.PHP_EOL.PHP_EOL, FILE_APPEND); 		 		
    //guardo se riesce a visitarla, praticamente guardo se la pagina esiste davvero osservando se testo è vuoto	 			
               if(!$html)     		{ 				
                   echo"Connessione fallita!"; 
    } 	 			 
               else{ 	    	 			
                //tengo solo i tag a 			
                $testopulito = strip_tags($html, "<a>");  	      
      //questa è un'espressione regolare che mi salva i link nella variabile matches 	                
              preg_match_all( '/<a.+?href="(http:\/\/www.[^0-9].+?)"/', $testopulito, $matches); 	  	        
     // Ciclo tutti i risultati li aggiungo in fondo alla coda e li stampo sul file
    
           foreach($matches[1] as $link){
                 array_push($coda,$link); 				 
                 file_put_contents($file, $link.PHP_EOL, FILE_APPEND); 	                
    } 	           
     } 		
    //rimuovo il primo elemento della coda, ossia l'url che è stata appena analizzata  
         $queue = array_shift($coda); 		
    Iteratore($queue);} 			
       function Iteratore($coda){ 	
    // Ciclo e recupero tutte le pagine nella coda fino a quando ci sono elementi 
    
    
    while(count($coda)>0) { 	    
      LeggiUrls($coda[0],$coda); } 
    } 	
    file_put_contents("link.txt", ''); //svuoto il file 	
    // Inizializzo la coda che contiene gli url. 	
    $coda = array("http://espresso.repubblica.it/");   	
    $seme= $coda[0]; 	
    LeggiUrls($seme,$coda); 	  	   	 
     ?>

  2. #2
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    modifica cosi' e vedi cosa ti stampa

    Codice PHP:

    while(count($coda)>0) {         
          
      
    LeggiUrls($coda[0],$coda);

    var_dump$coda ) ;
    echo 
    "<hr>" ;



  3. #3
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    stampa tutte le volte string 'http://espresso.repubblica.it/' e la lunghezza
    ah poi mi sono scordato di dire che alle iterazioni successive come coda [0] prende h, cioè la prima lettera della url

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Se ci pensi stai appunto passando una stringa ad una funzione che gestisce array come parametro in ingresso !!!!!!!!

  5. #5
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    si infatti, ma la cosa che non capisco è perchè sia una stringa.
    coda l'ho inizializzata con un array contenente solo la pagina iniziale, che viene poi visitata per trovarne i link. Questi link vengono messi nella coda con array_push e con array_shift levo il primo elemento cioè quello che ho appena visitato. Non riesco proprio a capire perchè la coda diventa una stringa

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Codice PHP:

    $dati 
    = array( "aadsad" ,"basdasd""casdasd"  ) ;

    echo 
    array_shift($dati) ;

    var_dump($dati) ; 

    Produce

    Codice PHP:
    aadsad

    array(2) {
      [
    0]=>
      
    string(7"basdasd"
      
    [1]=>
      
    string(7"casdasd"

    quindi in ciclo :

    Codice PHP:


    echo "<pre>" ;
    $dati = array( "aadsad" ,"basdasd""casdasd"  ) ;

    while( 
    $dato =  array_shift($dati) )
    {
        echo 
    $dato 
        echo 
    "\n\n" ;
    }

    echo
    "</pre>";
    die(); 
    e produce :
    Codice PHP:

    aadsad

    basdasd

    casdasd 

    Ora hai la soluzione

  7. #7
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    ahhhh capito! io avevo capito che facendo $queue = array_shift($coda), la queue avrebbe contenuto tutto il contenuto di coda eccetto il primo elemento, invece era l'esatto opposto. Come al solito mi ostino a non fare stampe di prova e non capisco gli errori
    Grazie mille, sei stato gentilissimo

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Nessun problema

    Cmq quando hai questi problemi controlla sempre la documentazione ufficiale che appunto dice che ritorna il valore estratto e manipola l'array riducendolo di 1 elemento

    Vabb l'imp e' che alla fine la procedura funzioni e che tu abbia capito l'errore

    Alla prossimaa

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.