0

I'm trying to convert simplexmlload string into array so I can output array values. But I'm getting this error when i try to output array value:

E_NOTICE : type 8 -- Undefined offset: 0 -- at line 55

error is on this line of code: echo $array[0];

Here is complete code:

<!DOCTYPE html>
<html>
<body>

<?php
$note=<<<XML
<Projects_Detail>
    <Mr-Imran>
        <projectBudget>125000</projectBudget>
    <EmpNo>E100</EmpNo>
    <DeptName>IT</DeptName>
    <HourlyRate>625</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>120000</projectBudget>
    <EmpNo>E101</EmpNo>
    <DeptName>Database</DeptName>
    <HourlyRate>500</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>135000</projectBudget>
    <EmpNo>E102</EmpNo>
    <DeptName>IT</DeptName>
    <HourlyRate>550</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>115000</projectBudget>
    <EmpNo>E103</EmpNo>
    <DeptName>Testing</DeptName>
    <HourlyRate>400</HourlyRate>
    </Mr-Imran>
    <Mr-Imran>
        <projectBudget>150000</projectBudget>
    <EmpNo>E110</EmpNo>
    <DeptName>Database</DeptName>
    <HourlyRate>375</HourlyRate>
    </Mr-Imran>
    <Mr-Imran>
        <projectBudget>140000</projectBudget>
    <EmpNo>E112</EmpNo>
    <DeptName>Testing</DeptName>
    <HourlyRate>425</HourlyRate>
    </Mr-Imran>
</Projects_Detail>

XML;

$xml=simplexml_load_string($note);
$array =  (array) $xml;
print_r(array_values($array));

echo $array[0];
?> 
Nigel Ren
  • 56,122
  • 11
  • 43
  • 55
Jazib
  • 3
  • 2
  • 1
    Possible duplicate of [PHP: "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset"](https://stackoverflow.com/questions/4261133/php-notice-undefined-variable-notice-undefined-index-and-notice-undef) – Nigel Ren Jun 02 '18 at 11:38
  • 1
    You should look into how to process SimpleXML rather than just cast it to an array and hope. – Nigel Ren Jun 02 '18 at 11:39
  • What kind of output do you expect to get? – AndrewShmig Jun 02 '18 at 13:55

1 Answers1

0

You can use SimpleXMLElement::children() method:

<?php
$note=<<<XML
<Projects_Detail>
    <Mr-Imran>
        <projectBudget>125000</projectBudget>
    <EmpNo>E100</EmpNo>
    <DeptName>IT</DeptName>
    <HourlyRate>625</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>120000</projectBudget>
    <EmpNo>E101</EmpNo>
    <DeptName>Database</DeptName>
    <HourlyRate>500</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>135000</projectBudget>
    <EmpNo>E102</EmpNo>
    <DeptName>IT</DeptName>
    <HourlyRate>550</HourlyRate>
    </Mr-Imran>

    <Mr-Imran>
        <projectBudget>115000</projectBudget>
    <EmpNo>E103</EmpNo>
    <DeptName>Testing</DeptName>
    <HourlyRate>400</HourlyRate>
    </Mr-Imran>
    <Mr-Imran>
        <projectBudget>150000</projectBudget>
    <EmpNo>E110</EmpNo>
    <DeptName>Database</DeptName>
    <HourlyRate>375</HourlyRate>
    </Mr-Imran>
    <Mr-Imran>
        <projectBudget>140000</projectBudget>
    <EmpNo>E112</EmpNo>
    <DeptName>Testing</DeptName>
    <HourlyRate>425</HourlyRate>
    </Mr-Imran>
</Projects_Detail>

XML;

$xml = simplexml_load_string($note);
$children = $xml->children();

foreach($children as $child) {
    print_r($child);
    echo "<br/>";
}

And you will receive following output:

SimpleXMLElement Object ( [projectBudget] => 125000 [EmpNo] => E100 [DeptName] => IT [HourlyRate] => 625 )
SimpleXMLElement Object ( [projectBudget] => 120000 [EmpNo] => E101 [DeptName] => Database [HourlyRate] => 500 )
SimpleXMLElement Object ( [projectBudget] => 135000 [EmpNo] => E102 [DeptName] => IT [HourlyRate] => 550 )
SimpleXMLElement Object ( [projectBudget] => 115000 [EmpNo] => E103 [DeptName] => Testing [HourlyRate] => 400 )
SimpleXMLElement Object ( [projectBudget] => 150000 [EmpNo] => E110 [DeptName] => Database [HourlyRate] => 375 )
SimpleXMLElement Object ( [projectBudget] => 140000 [EmpNo] => E112 [DeptName] => Testing [HourlyRate] => 425 )

By replacing foreach loop with upgraded one, where we use array-casting, you can have your XML data as handy array:

foreach($children as $child) {
    $childArray = (array)$child;
    print_r($childArray);
    echo "<br/>";
}

Will give you the following output:

Array ( [projectBudget] => 125000 [EmpNo] => E100 [DeptName] => IT [HourlyRate] => 625 )
Array ( [projectBudget] => 120000 [EmpNo] => E101 [DeptName] => Database [HourlyRate] => 500 )
Array ( [projectBudget] => 135000 [EmpNo] => E102 [DeptName] => IT [HourlyRate] => 550 )
Array ( [projectBudget] => 115000 [EmpNo] => E103 [DeptName] => Testing [HourlyRate] => 400 )
Array ( [projectBudget] => 150000 [EmpNo] => E110 [DeptName] => Database [HourlyRate] => 375 )
Array ( [projectBudget] => 140000 [EmpNo] => E112 [DeptName] => Testing [HourlyRate] => 425 ) 
AndrewShmig
  • 4,843
  • 6
  • 39
  • 68