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


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

Re: ritornare una list mixed

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>

Show all headers | View raw


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 | 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