Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #20945
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Newsgroups | it.comp.www.php |
| Subject | Re: ritornare una list mixed |
| Date | 2016-06-18 00:18 +0200 |
| Message-ID | <dsjba0Faq2hU3@mid.individual.net> (permalink) |
| References | <dsinv7F5lpjU1@mid.individual.net> <dsj563Fbsg9U1@mid.individual.net> |
On 17/06/2016 22:34, Alessandro Pellizzari wrote:
> 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.
infatti, ho provato e funziona perfettamente.
> 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];
Non so se l'ultima notazione funziona ma si può scrivere come
$return[] = [array($dom_child, $dom_child->nodeValue);
In alcuni casi si può anche scrivere come
$return[$dom_child->nodeValue] = $dom_child
> 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()")
Questa mi avrebbe risparmiato un'istruzione.
>
>> 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.
Troppo complicato per me...
--
Sandro kensan www.kensan.it & www.qiqi.it geek site
Saluto gli agenti della NSA - Hello NSA - www.nsa.gov
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