Moi. Tuolla https://www.php.net/manual/en/simplexmlelement.
<?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?
Minkä haluaisit tallentaa muuttujaan? Tuon muuttujan palautuksen voi laittaa muuttujaan näin:
$muuttuja = RecurseXML("XML-koodia...");
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.
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.
Kiitos!
Hoksasin vasta jälikäteen myös sen, että tuohon olisi voinu myös laittaa muuttujan globaaliksi.
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.
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.
Ja se tosiaan ottaa argumentikseen SimpleXMLElement-luokan tekemän arrayn.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.