Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: RecurseXml funktio

Sivun loppuun

pistemies [18.06.2012 21:40:09]

#

Moi. Tuolla https://www.php.net/manual/en/simplexmlelement.children.php oli tällainen lyhyt funktio.

<?php
function RecurseXML($xml,$parent="")
{
   $child_count = 0;
   foreach($xml as $key=>$value)
   {
      $child_count++;
      if(RecurseXML($value,$parent.".".$key) == 0)  // no childern, aka "leaf node"
      {
         print($parent . "." . (string)$key . " = " . (string)$value . "<BR>\n");
      }
   }
   return $child_count;
}

?>

Tuo olisi muuten kätevä lyhykäisyydessään, mutta miten tuon saisi tallennettua muutujaan, jotta sitä voisi käyttää jotenkin?

Olli [18.06.2012 22:50:03]

#

Minkä haluaisit tallentaa muuttujaan? Tuon muuttujan palautuksen voi laittaa muuttujaan näin:

$muuttuja	= RecurseXML("XML-koodia...");

-tossu- [18.06.2012 23:16:45]

#

Pistemies halusi varmasti saada muuttujaan sen, minkä funktio nyt tulostaa suoraan. Se onnistuu tällä tavalla:

function RecurseXML($xml,&$output,$parent="")
{
   $child_count = 0;
   foreach($xml as $key=>$value)
   {
      $child_count++;
      if(RecurseXML($value,$output,$parent.".".$key) == 0)  // no childern, aka "leaf node"
      {
         $output .= $parent . "." . (string)$key . " = " . (string)$value . "<BR>\n";
      }
   }
   return $child_count;
}

RecurseXML($xml,$tuloste);

echo $tuloste;

Olli: Esimerkissäsi muuttujaan yritetään tallentaa juurielementin lapsielementtien lukumäärä, mikä lienee tässä tapauksessa melko hyödytön tieto. Yritykseksi se jääkin, sillä RecurseXML-funktio ei käsittele XML-koodia merkkijonona.

Olli [19.06.2012 07:52:10]

#

Oikeassa olet, -tossu-. En tullut katsoneeksi funktiota tarkemmin. Se tosiaan haluaa $xml-muuttujan arrayna. Ja tulostus oli myös keskellä funktiota, eikä pelkästään lopussa.

pistemies [19.06.2012 10:37:16]

#

Kiitos!
Hoksasin vasta jälikäteen myös sen, että tuohon olisi voinu myös laittaa muuttujan globaaliksi.

Tukki [19.06.2012 17:02:16]

#

Olli kirjoitti:

Oikeassa olet, -tossu-. En tullut katsoneeksi funktiota tarkemmin. Se tosiaan haluaa $xml-muuttujan arrayna.

Vaikea sanoa mitä funktion tekijä on tarkoittanut, mutta array on kyllä huono parametri tuolle funktiolle (olettaen että arrayn arvot eivät ole olioita), koska parametria käytetään suoraan foreachissa tarkistamatta sitä. Jos siis parametrina annetaan array niin tuloksena on aina yksi tai useampi virhe.

Ennemmin voisi kuvitella että tuolle on tarkoitettu annettavaksi esim. SimpleXMLElement tai muu Traversable rajapinnan toteuttava olio, jolloin virhettä ei foreachin kohdalla tule kun rekursio päättyy. Jos tuo on tarkoitus niin se tietysti olisi hyvä pakottaa ihan parametrilistauksessakin.

pistemies kirjoitti:

Hoksasin vasta jälikäteen myös sen, että tuohon olisi voinu myös laittaa muuttujan globaaliksi.

Ei silti kannata tehdä niin monestakin syystä. -tossu-:n tapa on parempi.

pistemies [20.06.2012 11:52:53]

#

Tukki kirjoitti:

Ennemmin voisi kuvitella että tuolle on tarkoitettu annettavaksi esim. SimpleXMLElement tai muu Traversable rajapinnan toteuttava olio, jolloin virhettä ei foreachin kohdalla tule kun rekursio päättyy. Jos tuo on tarkoitus niin se tietysti olisi hyvä pakottaa ihan parametrilistauksessakin.

Kyseessä on tuolla sivulla alempana oleva esimerkki: https://www.php.net/manual/en/simplexmlelement.children.php#75311 (siellä on kaksikin RecurseXML-esimerkkiä)

Ja se tosiaan ottaa argumentikseen SimpleXMLElement-luokan tekemän arrayn.

Tukki [20.06.2012 13:01:33]

#

pistemies kirjoitti:

Ja se tosiaan ottaa argumentikseen SimpleXMLElement-luokan tekemän arrayn.

SimpleXMLElement-luokka ei tee tässä tapauksessa arrayta vaan toteuttaa itse PHP:n sisäisen Traversable-rajapinnan, joka mahdollistaa kyseisen luokan olioiden iteroimisen suoraan foreach-loopissa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta