Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SimpleXMLElement to PHP Array [duplicate]

Variable $d comes from file_get_contents function to a URL.

$answer = @new SimpleXMLElement($d);

Below is output of the print_r($answer):

SimpleXMLElement Object
(
  [Amount] => 2698
  [Status] => OK
  [State] => FL
  [Country] => USA
)

How can I retrieve value of each element and add to an array? I can't figure it out.

like image 632
Codex73 Avatar asked Apr 28 '10 02:04

Codex73


4 Answers

In this simple case type casting will also work:

$my_array = (array)$answer
like image 137
dkinzer Avatar answered Nov 14 '22 22:11

dkinzer


This should work:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
like image 31
Damian Alberto Pastorini Avatar answered Nov 14 '22 21:11

Damian Alberto Pastorini


The $answer can already work as an array. You can do this if you want put it in a real array,

$array = array();
foreach($answer as $k => $v) {
  $array[$k] = $v;
}
like image 13
ZZ Coder Avatar answered Nov 14 '22 23:11

ZZ Coder


I have a problem with this function because typecasting every XML child to an array can be problematic when the text is between CDATA tags.

I fixed this by checking if the result of the typecasting to an array is empty. If so typecast it to a string and you will get a proper result.

Here is my modified version with CDATA support:

function SimpleXML2ArrayWithCDATASupport($xml)
{   
    $array = (array)$xml;

    if (count($array) === 0) {
        return (string)$xml;
    }

    foreach ($array as $key => $value) {
        if (!is_object($value) || strpos(get_class($value), 'SimpleXML') === false) {
            continue;
        }
        $array[$key] = SimpleXML2ArrayWithCDATASupport($value);
    }

    return $array;
}
like image 8
Bo Pennings Avatar answered Nov 14 '22 22:11

Bo Pennings