[Php-it] Elaborare un XML da php4: lentezza e troppe risorse usate

Domenico L. domenico.lorusso at pleiade.it
Thu Mar 8 16:53:50 CET 2007


RedFoxy ha scritto:
>> Domenico L. ha scritto:
>>> Cmq se la struttura è così semplice quasi non ti conviene richiamare 
>>> un parser xml,
>>> ma fare tutto con le er
>>>
>>> Cioè ti definisci un array di attributi
>>>
>>> attr=array('op', 'idb', 'idc', 'data_ins');
>>>
>>> e per ogni record (precedentemente messo in un array );
>>>
>>> foreach ($attr as $a)
>>> preg_match di "#$a=\"(.*)\"#sUD"
>>>
>>> nella posizione 1 dell'array generato dovresti trovare il valore
>> Anzi se fai una preg_match_all di #(\w+)="(.*)"#sUD
>> applicata per ogni record sempre
>
> Effettivamente usando questa preg per tutti i record (togliendo id 
> mezzo tutti il resto) mi tirerei fuori tutti i dati con il nome 
> variabile in [1] e in [2] i valori... pero' ha una pecca questo 
> sistema, se chi fa' l'xml mi inverte l'ordine delle variabili, mi 
> sballa la presenza dentro l'array
>
assolutamente no,
o meglio in [1] hai le chiavi in [2] i corrispondenti
ti basta usare array_combine seguito da ksort per avere sempre lo stesso 
ordine

Ho dato un 'occhiata al tuo codice.... alcune considerazione
- Mi sembra che non sfrutti a pieno la potenza delle er
- Occupati di ottenere prima un array associativo con i dati, poi valida 
in cascata il contenuto, dovrebbe risultare più chiaro e credo 
mediamente più veloce
- [dettaglio] usa l'approccio if error break (da più leggibilità al codice)


Inoltre in ogni file può esserci un dataroot altrimenti non è xml oppure 
esiste un tag superiore di cui non hai parlato...
e nel codice che usi sembri partire da questo approccio.. se questo è 
vero l'array si ottiene con poche operazioni:

sia $testo la parte di testo contenente i record

preg_metch_all('#\<rec\s.*/\>#sUD',$testo,$m);

$record=$m[0];
$n=count($record);
$out=array();
for ($i=0;$i<$n;$i++){
    preg_match_all('#(\w+)="(.*)"#sUD',$record[$i],$m);
    #->io uso $i ma potresti usare una altro campo se hai una chiave 
primaria per esempio
    #->Ci va anche poco ad inserire qui un controllo per vedere che ci 
siano tutte le chiavi obbligatorie
    #->Quello sulla correttezza dei valori magari lo farei dopo cmq
    $out[$i]=array_combine($m[1],$m[2] );
}
unset($m,$record);


Ora fai i controlli su $out, al limite puoi metterli su di un file o 
qualcosa di simile


Ciao


-- 
Domenico L.                             icq: 645 44 861

per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria... [F.d.A.]



More information about the Php-it mailing list