PHP & SimpleXML
XML, PHP August 23rd. 2007, 1:40pmKako v PHP-ju iz SimpleXMLElement-a dobiti string? Zelo zanimiva zadeva.
1 2 3 4 5 6 | $data = "<?xml version=\"1.0\" encoding=\"utf-8\">"; $data .= "<xml><node>tekst</node></xml>"; $xml = new SimpleXMLElement($data); $string = $xml->node; var_dump($string); |
No, zgornja koda bi po pričakovanju morala izpisati:
1 | tekst |
Vrne pa:
1 2 3 4 | object(SimpleXMLElement)#2 (1) { [0]=> string(5) "tekst" } |
Kaj pa če napiš¡emo:
1 | echo $xml->node; |
Takrat izpiše:
1 | tekst |
Torej problem je, da v nam spremenljivko shrani SimpleXMLElement objekt, izpiše pa string. To zna biti nerodno sploh pri ajax zadevah - npr: v array shranimo neke stringe in jih spustimo preko funkcije json_encode in preko js-ja pošljemo na clienta. Namesto stringov, pa so notri objekti. Ni vredu. Sodelavc je poštudiru, da se da zadeva rešit na zelo simpl način in sicer:
1 | $string = "".$xml->node; |
Sedaj pa tudi var_dump izpiše prav:
1 | string(5) "tekst" |
Se pravi, da dodamo prazen string in zadeva je rešena.
Očitno php nekaj interno zmučka s tem objektom, kaj pa sam bog ve. No, važno, da dela. Upam, da bo ta "trik" komu prišel še prav, meni prav gotovo je.
August 23rd, 2007 at 6:40 pm
Tale rešitev:
$string = "".$xml->node;je nekako grda, zato bi priporoÄal malce lepÅ¡o reÅ¡itev in bolj berljivo reÅ¡itev z cast-anjem:
$string = (string)$xml->node;August 23rd, 2007 at 10:37 pm
Le kako se nisem tega spomnil že prej?
August 24th, 2007 at 6:17 am
Ena izmed rešitev je tudi:
$string = strval($xml->node);Je pa splošno bolj uporabljana tista, ki jo je napisal sverde1.
August 24th, 2007 at 8:55 am
js uporabljam raje reÅ¡itve take kot je napisal sverde1, moj sodelavc pa raje funkcije - intval, floatval, ….
August 24th, 2007 at 4:21 pm
@SFfreak: (string) je par nanosekund hitrejš od strval()
August 24th, 2007 at 8:25 pm
Si naredu test al si to reku kr na blef?
August 24th, 2007 at 11:10 pm
Ja sm enkrat testiru tole se mi zdi, že nekaj Äasa nazaj. Pa Å¡e zdle sem ponovil test… Rezultati so (pri 2^16 ponovitvah):
(string):1.13572590256
strval():1.84223914146
tvoja rešitev z narekovaji:1.14568502998
Castanje zmaga nad vsemi
Kodo, s katero sem testiral pa lahko dobiÅ¡ tle, da ne bo kakÅ¡nih ugibanj, da sem sluÄajno rezultate prireju :P. Tisto glede nanosekund sem pa napisal zaredi tegale.
August 25th, 2007 at 10:11 am
Torej bomo od zdaj naprej cast-al.