Visualizzazione dei risultati da 1 a 3 su 3

Discussione: problemi con global

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    problemi con global

    salve a tutti,
    sto usando queste funzioni per parsare il file xml

    codice:
    //funzione che mi ritorna un file xml in array
    //var
    	$struct = array(); 
    	$xml_parser = xml_parser_create(); 
     
    	function startElement($parser, $name, $attrs) { 
      		global $struct;
      		$tag = array("name"=>$name,"attrs"=>$attrs); 
    		array_push($struct,$tag); 
    	} 
     
    	function data($parser, $data) { 
    		global $struct,$i; 
    		if(trim($data)) { 
        		$struct[count($struct)-1]['data']=$data; 
      		} 
    	} 
     
    	function endElement($parser, $name) { 
      		global $struct; 
     		$struct[count($struct)-2]['child'][] = $struct[count($struct)-1]; 
     		array_pop($struct); 
    	} 
     
    	xml_set_element_handler($xml_parser, "startElement", "endElement"); 
    	xml_set_character_data_handler($xml_parser, "data"); 
     
    
     	//or 
    	//$file = url;
    	$xmlFile='prova.xml';
    	$parse = xml_parse($xml_parser,file_get_contents($xmlFile)); 
     
    		if(!$parse) { 
    		  die("XML parsing error"); 
    		} 
     
    	xml_parser_free($xml_parser); 
    	 
    	print_r($datimodulo = $struct[0][child]);
    ... se inserisco il tutto in una function mi crea qualche problema con la variabile globa.. come posso risolvere?

    codice:
    function xmlParser($xmlFile){
    //funzione che mi ritorna un file xml in array
    //var
    	$struct = array(); 
    	$xml_parser = xml_parser_create(); 
     
    	function startElement($parser, $name, $attrs) { 
      		global $struct;
      		$tag = array("name"=>$name,"attrs"=>$attrs); 
    		array_push($struct,$tag); 
    	} 
     
    	function data($parser, $data) { 
    		global $struct,$i; 
    		if(trim($data)) { 
        		$struct[count($struct)-1]['data']=$data; 
      		} 
    	} 
     
    	function endElement($parser, $name) { 
      		global $struct; 
     		$struct[count($struct)-2]['child'][] = $struct[count($struct)-1]; 
     		array_pop($struct); 
    	} 
     
    	xml_set_element_handler($xml_parser, "startElement", "endElement"); 
    	xml_set_character_data_handler($xml_parser, "data"); 
     
    
     	//or 
    	//$file = url;
    	
    	$parse = xml_parse($xml_parser,file_get_contents($xmlFile)); 
     
    		if(!$parse) { 
    		  die("XML parsing error"); 
    		} 
     
    	xml_parser_free($xml_parser); 
    	 
    	return $datimodulo = $struct[0][child];
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361
    gli errori sono questi:

    Warning: array_push() [function.array-push]: First argument should be an array in D:\lavori\webserver\cms\administration\function\fu nction.parser.php on line 11

    Warning: array_push() [function.array-push]: First argument should be an array in D:\lavori\webserver\cms\administration\function\fu nction.parser.php on line 11

  3. #3
    Giustamente come hai detto, il problema sono le variabili globali, in quanto tutte le variabili definite in una funzione hanno scope locale.
    Il problema principale, ora, riguarda la variabile $struct. Infatti quando ad esempio in function startElement,
    usi global $struct;
    questa variabile risulta essere indefinita.
    Quindi l'unica cosa da fare è una cosa simile:

    Passi la variabile $struct in input alla funzione

    function startElement($parser, $name, $attrs, $struct)
    {
    $tag = array("name"=>$name,"attrs"=>$attrs);
    array_push($struct,$tag);
    return $struct;
    }

    e ne ritorni il valore di $struct.
    presta attenzione, però perché la chiamata a questa funzione deve essere del tipo

    $struct = startElement($parser, $name, $attrs, $struct);

    Questo perché il passaggio dei parametri in php è per valore, quindi la variabile $struct usata all'interno di startElement è diversa da quella dichiarata all'esterno.

    Così anche per le altre funzioni.

    Osservazione: nella funzione data usi global $struct,$i; ma $i non la usi né la definisci da alcuna parte.

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.