Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #20944
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Newsgroups | it.comp.www.php |
| Subject | Re: ritornare una list mixed |
| Date | 2016-06-17 20:34 +0000 |
| Message-ID | <dsj563Fbsg9U1@mid.individual.net> (permalink) |
| References | <dsinv7F5lpjU1@mid.individual.net> |
Il Fri, 17 Jun 2016 18:48:39 +0200, Sandro kensan ha scritto:
> Ho una funzione ricorsiva che usa come valori di ritorno un array di
> stringhe e un array di nodi di un DOM document, gli array sono della
> stessa lunghezza. Come posso ritornarli nella mia funzione ricorsiva?
Puoi sicuramente tornare un array (di array) misto. L'unica limitazione
degli array di PHP è che le chiavi devono essere scalari, ma i valori
possono essere qualsiasi cosa.
Ma io onestamente farei in modo diverso...
> function recursively_find_text_nodes($dom_element) {
> global $node;
> $return = array();
>
> foreach ($dom_element->childNodes as $dom_child) {
> switch ($dom_child->nodeType) {
> case XML_TEXT_NODE:
> if (trim($dom_child->nodeValue) !== '') {
> $return[] = $dom_child->nodeValue;
> $node[] = $dom_child;
Qui i due valori sono strettamente correlati.
Hai due possibilità, secondo me:
1- tornare solo il nodo, che tanto da lì puoi sempre recuperare il valore:
$return[] = $domNode;
2- tornare ogni elemento come "sotto-array" che li contiene entrambi:
$return[] = [$dom_child, $dom_child->nodeValue];
Questa seconda ti permette di fare
foreach (recursively_find_text_nodes($dom) as list($elem, value)) { ... }
(Non mi ricordo da che versione di PHP puoi usare "as list()")
> Può funzionare?
Se <strike>ti vuoi male</strike> vuoi vivere nel futuro, puoi usare i
generatori:
function find_text_nodes($dom_element)
{
foreach ($dom_element->childNodes as $dom_child) {
switch ($dom_child->nodeType) {
case XML_TEXT_NODE:
if (trim($dom_child->nodeValue) !== '') {
yield $dom_child;
}
break;
case XML_ELEMENT_NODE:
yield from find_text_nodes($dom_child);
break;
}
}
}
foreach (find_text_nodes($elem) as $node) {
...
}
WARNING: codice non testato, scritto di getto, e richiede PHP7. :)
Questa versione ha il vantaggio che non tiene in memoria la lista di tutti
i nodi e del loro contenuto, ma ne genera uno alla volta man mano che li
consumi, quindi puoi potenzialmente parsare un HTML il doppio più grosso
con la stessa quantità di RAM.
Bye.
Back to it.comp.www.php | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
ritornare una list mixed Sandro kensan <kensan@kensan.it> - 2016-06-17 18:48 +0200
Re: ritornare una list mixed fmassei@gmail.com - 2016-06-17 10:26 -0700
Re: ritornare una list mixed Sandro kensan <kensan@kensan.it> - 2016-06-17 20:49 +0200
Re: ritornare una list mixed fmassei@gmail.com - 2016-06-17 12:11 -0700
Re: ritornare una list mixed Sandro kensan <kensan@kensan.it> - 2016-06-17 22:01 +0200
Re: ritornare una list mixed fmassei@gmail.com - 2016-06-17 16:51 -0700
Re: ritornare una list mixed Alessandro Pellizzari <shuriken@amiran.it> - 2016-06-17 20:34 +0000
Re: ritornare una list mixed Sandro kensan <kensan@kensan.it> - 2016-06-18 00:18 +0200
Re: ritornare una list mixed fmassei@gmail.com - 2016-06-17 17:26 -0700
Re: ritornare una list mixed Alessandro Pellizzari <shuriken@amiran.it> - 2016-06-18 16:28 +0000
Re: ritornare una list mixed fmassei@gmail.com - 2016-06-18 12:29 -0700
csiph-web