Potrzebuję rekursywnie rzutować PHP SimpleXMLObject na tablicę. Problem polega na tym, że każdy element podrzędny jest również PHP SimpleXMLElement.Rekursywne rzutowanie z SimpleXMLObject na Array
Czy to możliwe?
Potrzebuję rekursywnie rzutować PHP SimpleXMLObject na tablicę. Problem polega na tym, że każdy element podrzędny jest również PHP SimpleXMLElement.Rekursywne rzutowanie z SimpleXMLObject na Array
Czy to możliwe?
json_decode(json_encode((array) simplexml_load_string($obj)), 1);
nie testowałem ten jeden, ale wydaje się to zrobić to:
function convertXmlObjToArr($obj, &$arr)
{
$children = $obj->children();
foreach ($children as $elementName => $node)
{
$nextIdx = count($arr);
$arr[$nextIdx] = array();
$arr[$nextIdx]['@name'] = strtolower((string)$elementName);
$arr[$nextIdx]['@attributes'] = array();
$attributes = $node->attributes();
foreach ($attributes as $attributeName => $attributeValue)
{
$attribName = strtolower(trim((string)$attributeName));
$attribVal = trim((string)$attributeValue);
$arr[$nextIdx]['@attributes'][$attribName] = $attribVal;
}
$text = (string)$node;
$text = trim($text);
if (strlen($text) > 0)
{
$arr[$nextIdx]['@text'] = $text;
}
$arr[$nextIdx]['@children'] = array();
convertXmlObjToArr($node, $arr[$nextIdx]['@children']);
}
return;
}
Zrobione z http://www.codingforums.com/showthread.php?t=87283
ta nie działa dla mnie –
Nie wiem, jak to „nie działa” dla innych, ale ma za zadanie iteracja wszystkich dzieci i atrybutów. –
Nie czyta CDATA – reggie
To jest możliwe. Jest to funkcja rekursywna, która wypisuje tagi elementów nadrzędnych oraz znaczniki + zawartość elementów, które nie mają więcej dzieci. Możesz zmienić ją zbudować tablicę:
foreach($simpleXmlObject as $element)
{
recurse($element);
}
function recurse($parent)
{
echo '<' . $parent->getName() . '>' . "\n";
foreach($parent->children() as $child)
{
if(count($child->children()) > 0)
{
recurse($child);
}
else
{
echo'<' . $child->getName() . '>';
echo iconv('UTF-8', 'ISO-8859-1', $child);
echo '</' . $child->getName() . '>' . "\n";
}
}
echo'</' . $parent->getName() . '>' . "\n";
}
ja nie widzę sensu, ponieważ SimpleXMLObject można Threated podobnie jak tablice w każdym razie ...
Ale jeśli naprawdę potrzebujesz, że po prostu sprawdzić odpowiedź chassagnette za z this thread lub this post na forum.
Z wyjątkiem sytuacji, gdy chcesz przechowywać go w sesji, uzyskanie "Serializacji" SimpleXMLElement "nie jest dozwolone " kiedy próbuję tego. Dlatego przesyłanie do tablicy jest użyteczne –
@GromBeestje: XML jest już serializowany. Nie ma problemu z zapisaniem ciągu znaków w sesji :) – hakre
Analizowanie łańcucha XML za każdym razem, gdy ładuje się skrypt, wydaje się nieefektywne, dlatego myślę, że sensowne jest przechowywanie przeanalizowanego formularza. –
sprytny! Nigdy bym tego nie pomyślał. –
W miarę możliwości dałbym ci 100 przegranych. To po prostu niesamowite :) –
Sprytne, ale czytelne, do utrzymania i eleganckie. – Eddified