[Php-it] Elaborare un XML da php4: lentezza e troppe risorse usate
Domenico Lorusso
domenico.lorusso at pleiade.it
Thu Mar 8 17:47:03 CET 2007
[Re Invio perché non lo vedo...]
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