Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #20944

Re: ritornare una list mixed

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar | Unroll thread


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