Last active
July 15, 2025 10:09
-
-
Save jasondmoss/7344311 to your computer and use it in GitHub Desktop.
Convert a SimpleXML object to associative array
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Convert a SimpleXML object to an associative array | |
| * | |
| * @param object $xmlObject | |
| * | |
| * @return array | |
| * @access public | |
| */ | |
| function simpleXmlToArray($xmlObject) | |
| { | |
| $array = []; | |
| foreach ($xmlObject->children() as $node) { | |
| $array[$node->getName()] = is_array($node) ? simplexml_to_array($node) : (string) $node; | |
| } | |
| return $array; | |
| } |
I refactored it to be more readable -> tested on php 8.3 + changed how attributes are stored
/**
* Converts a SimpleXMLElement object to an associative array.
*/
public static function simpleXmlToArray(?SimpleXMLElement $xml): array|string {
if ($xml === null) {
return [];
}
$result = [];
foreach ($xml->attributes() as $attrName => $attrValue) {
$result['@attributes'][$attrName] = (string) $attrValue;
}
foreach ($xml->children() as $childName => $childElement) {
$childArray = self::simpleXmlToArray($childElement);
if (!isset($result[$childName])) {
$result[$childName] = $childArray;
continue;
}
if (!is_array($result[$childName]) || !array_is_list($result[$childName])) {
$result[$childName] = [$result[$childName]];
}
$result[$childName][] = $childArray;
}
$textContent = trim((string) $xml);
if (empty($result)) {
return $textContent;
}
if ($textContent !== '') {
$result['@value'] = $textContent;
}
return $result;
}
Thanx @Harfusha , saved me lot of time !
Will this give the expected result?
json_decode(json_encode($xml), true);
For the most part this worked for me, but I found some instances maybe 5 levels in that had CDATA content and were simply converted to an empty array.
Author
Thanks everyone for chipping in to this simple little snippet (which worked for my purpose at the time). I mainly just use Gists as 'notes to self'. This has just kept growing :) Great job.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
That works like a charm. Thanks!