16

Consider the following code:

$string = '<device>
    <id>1234</id>
    <label>118</label>
    <username>root</username>
    <password>helloWorld</password>
    <hardware>
        <memory>4GB RAM</memory>
        <storage_drives>
            <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1>
            <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2>
            <storage_drive_3>Not Applicable</storage_drive_3>
            <storage_drive_4>Not Applicable</storage_drive_4>
        </storage_drives>
    </hardware>
</device>';
$xml = new SimpleXMLElement($string);

$deviceDetails = Array();
foreach($xml as $element){
    $tag = $element->getName();
    $deviceDetails +=  Array($tag => '$element->$tag)',
        );
    }

Output $detailsDetails array is as follows:

Array
(
    [id] => $element->$tag)
    [label] => $element->$tag)
    [username] => $element->$tag)
    [password] => $element->$tag)
    [hardware] => $element->$tag)
)

which is wrong.

My question is, how to make $element->$tag work?

1
  • 1
    Use double quotes instead of single quotes (or none at all) Commented Oct 15, 2011 at 15:44

3 Answers 3

16

Try this:

$string = '<device>
  <id>1234</id>
  <label>118</label>
  <username>root</username>
  <password>helloWorld</password>
  <hardware>
    <memory>4GB RAM</memory>
     <storage_drives>
      <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1>
      <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2>
      <storage_drive_3>Not Applicable</storage_drive_3>
      <storage_drive_4>Not Applicable</storage_drive_4>
    </storage_drives>
  </hardware>
</device>';
  
$xml = json_decode(json_encode((array) simplexml_load_string($string)), 1);

This will output:

Array
(
    [id] => 1234
    [label] => 118
    [username] => root
    [password] => helloWorld
    [hardware] => Array
        (
            [memory] => 4GB RAM
            [storage_drives] => Array
                (
                    [storage_drive_1] => 2TB SATA 7,200RPM
                    [storage_drive_2] => 1TB SATA 7,200RPM
                    [storage_drive_3] => Not Applicable
                    [storage_drive_4] => Not Applicable
                )

        )

)

or if you don't like this, you can use a PHP class like: http://www.bin-co.com/php/scripts/xml2array/

or view dfsq answer

Sign up to request clarification or add additional context in comments.

4 Comments

It doesn't work recursively. [storage_drives] => SimpleXMLElement Object.
+1 for this method. Although it not really good technic to do like this but for simple small objects it doesn't make sense to use functions etc. to convert object to array.
by the way, no need of (array) befor simplexml_load_string
I prefer your method for sure, I just wanted to show a quick & easy way to do it!
15

Book Of Zeus code wrapped in function to make it work recursively:

function xml2array($xml)
{
    $arr = array();

    foreach ($xml as $element)
    {
        $tag = $element->getName();
        $e = get_object_vars($element);
        if (!empty($e))
        {
            $arr[$tag] = $element instanceof SimpleXMLElement ? xml2array($element) : $e;
        }
        else
        {
            $arr[$tag] = trim($element);
        }
    }

    return $arr;
}

$xml = new SimpleXMLElement($string);
print_r(xml2array($xml));

Array
(
    [id] => 1234
    [label] => 118
    [username] => root
    [password] => helloWorld
    [hardware] => Array
    (
        [memory] => 4GB RAM
        [storage_drives] => Array
        (
            [storage_drive_1] => 2TB SATA 7,200RPM
            [storage_drive_2] => 1TB SATA 7,200RPM
            [storage_drive_3] => Not Applicable
            [storage_drive_4] => Not Applicable
        )
    )
)

3 Comments

@dfsq - this seems to not work through the entire array, it's like it only returns the first entry for me... is that possible?
@Shackrock Check out the solution from Book Of Zeus
@shackrock is right, this is great for SimpleXMLElements that do not have any lists. For my own purposes I just removed the $arr[$tag] = ternary line and split it into full conditions, in the case $element is a SimpleXMLElement, do $arr[$tag][] = xml2array($element);. Note the []. Not sure if that's what others would need, however.
4

Try This:

$array = json_decode(json_encode((array)$xml), TRUE);

1 Comment

Welcome to Stack Overflow! While this code may answer the question, providing additional context regarding why and/or how this code answers the question improves its long-term value.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.