0

I have the following XML structure stored in my database:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Payouts>
<Range end="1" start="1">900</Range>
<Range end="2" start="2">650</Range>     
<Range end="3" start="3">450</Range>     
<Range end="4" start="4">330</Range>     
<Range end="5" start="5">230</Range>     
<Range end="6" start="6">175</Range>     
<Range end="7" start="7">120</Range>     
<Range end="8" start="8">95</Range>     
<Range end="9" start="9">80</Range>     
<Range end="10" start="10">70</Range>     
<Range end="15" start="11">50</Range>     
<Range end="20" start="16">35</Range>     
<Range end="25" start="21">25</Range>     
<Range end="30" start="26">18</Range>     
<Range end="40" start="31">15</Range>     
<Range end="50" start="41">14</Range>     
<Range end="75" start="51">13</Range>     
<Range end="100" start="76">12</Range>     
<Range end="125" start="100">11</Range>     
<Range end="150" start="126">10</Range>     
<Range end="200" start="151">9</Range>     
<Range end="350" start="201">8</Range>     
<Range end="360" start="351">7</Range>     
<Range end="380" start="361">6</Range>   
<Range end="400" start="381">5</Range>   
<Range end="420" start="401">4</Range>   
<Range end="440" start="421">3</Range>   
<Range end="460" start="441">2</Range>   
<Range end="480" start="461">1</Range>   
<Range end="500" start="481">1</Range>   
<Range end="520" start="501">1</Range>   
</Payouts>

This is basically a range of options. I'd like to filter through these results and get the value in the end and start and then display the value for that row.

The output would be something like the following:

1st - 900 2nd - 650 3rd - 450 4th - 330 5th - 230 6th - 175 7th - 120 8th - 95 9th - 80 10th - 70 11th to 15th - 50 16th to 20th - 35 21th to 25th - 25

I tried to read the XML file with the following code:

$payout_xml = $event_details[0]['PAYOUT_DETAILS'];
$xml = new SimpleXMLElement($payout_xml);
echo "The Simple Element is: ".print_r($xml);
echo 'single value: <br />';
echo $xml->Payouts->Range->end; // get single value
echo "end of data";

When I print_r the $payout_xml I get the following results:

SimpleXMLElement Object
(
[Range] => Array
    (
        [0] => 900
        [1] => 650
        [2] => 450
        [3] => 330
        [4] => 230
        [5] => 175
        [6] => 120
        [7] => 95
        [8] => 80
        [9] => 70
        [10] => 50
        [11] => 35
        [12] => 25
        [13] => 18
        [14] => 15
        [15] => 14
        [16] => 13
        [17] => 12
        [18] => 11
        [19] => 10
        [20] => 9
        [21] => 8
        [22] => 7
        [23] => 6
        [24] => 5
        [25] => 4
        [26] => 3
        [27] => 2
        [28] => 1
        [29] => 1
        [30] => 1
    )

)
The Simple Element is: 1 

I'm not accessing the data though. How can I do this?

3
  • 1
    please show your entire code that is necessary to get the data from the database and the output you get. Commented Jun 5, 2016 at 20:24
  • Can you try printing both $event_details[0]['PAYOUT_DETAILS'] & $xml to make sure they actually contain data? Commented Jun 5, 2016 at 20:26
  • Johannes and love I updated the question with the output of those results. Commented Jun 5, 2016 at 20:34

1 Answer 1

1

end is an attribute, not an element. Try something like:

echo $sxml->Range . '|' . $sxml->Range['end'] . '|' . $sxml->Range['start'];

which will give the output as

900|1|1

Functional example

$xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Payouts>
<Range end="1" start="1">900</Range>
<Range end="2" start="2">650</Range>     
<Range end="3" start="3">450</Range>     
<Range end="4" start="4">330</Range>     
<Range end="5" start="5">230</Range>     
<Range end="6" start="6">175</Range>     
<Range end="7" start="7">120</Range>     
<Range end="8" start="8">95</Range>     
<Range end="9" start="9">80</Range>     
<Range end="10" start="10">70</Range>     
<Range end="15" start="11">50</Range>     
<Range end="20" start="16">35</Range>     
<Range end="25" start="21">25</Range>     
<Range end="30" start="26">18</Range>     
<Range end="40" start="31">15</Range>     
<Range end="50" start="41">14</Range>     
<Range end="75" start="51">13</Range>     
<Range end="100" start="76">12</Range>     
<Range end="125" start="100">11</Range>     
<Range end="150" start="126">10</Range>     
<Range end="200" start="151">9</Range>     
<Range end="350" start="201">8</Range>     
<Range end="360" start="351">7</Range>     
<Range end="380" start="361">6</Range>   
<Range end="400" start="381">5</Range>   
<Range end="420" start="401">4</Range>   
<Range end="440" start="421">3</Range>   
<Range end="460" start="441">2</Range>   
<Range end="480" start="461">1</Range>   
<Range end="500" start="481">1</Range>   
<Range end="520" start="501">1</Range>   
</Payouts>';
$sxml = new SimpleXMLElement($xml);
echo $sxml->Range . '|' . $sxml->Range['end'] . '|' . $sxml->Range['start']; // get single value

Demo: https://eval.in/583665

or if you want to iterate through all records, https://eval.in/583666.

foreach($sxml->Range as $range){
     echo $range . '|' . $range['end'] . '|' . $range['start'] . "\n";
}
Sign up to request clarification or add additional context in comments.

1 Comment

This is really good. How would I loop through this results for each Range? Nevermind...you already updated your answer.

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.