0

I am using an XML parser to store the xml feed datas into mysql table and if I get an XML file result as an array, the result is shown below. How to store the each values into a variable.

Not this type of array only, If we use an different XML file or URL it's result may be no of multidimensional arrays.

How to store the array values in php variables

   <?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
    $arrData = array();

    // if input is object, convert into array
    if (is_object($arrObjData)) {
        $arrObjData = get_object_vars($arrObjData);
    }

    if (is_array($arrObjData)) {
        foreach ($arrObjData as $index => $value) {
            if (is_object($value) || is_array($value)) {
                $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}


$xmlUrl = "testxmel.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);

Testxmel.xml

<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

Anybody can help me to solve this XML parser result problem. Thanks in advance

2
  • What's wrong with an array? It's the best way of storing this type of data. You can't have multiple $name variables in PHP. What do you want to do with those variables afterwards? Commented Feb 4, 2013 at 7:34
  • My question is how to store these values in a php variables like this foreach($arrXml as $row) { } Commented Feb 4, 2013 at 7:35

2 Answers 2

2
// let's assume $myArray is your array

$guest = count( $myArray ); // no. of guests

foreach( $myArray as $guests ) {
   $name = $guests[ 'name' ];
   $age = $guests[ 'age' ];

   // work with this data here...
}

Hope this helps.

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

3 Comments

It shows error as " Invalid argument supplied for foreach() in E:\wamp\www\testxml.php on line 31"
I've used $myArray as an array. Replace it with your array.
I also replaced but it not works. I think the array count is 1. Thats why it shows the invalid argument.
1

Self-contained example using pdo

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);

$stmt = $pdo->prepare('INSERT INTO soFoo (name, age) VALUES (:name, :age)');
$stmt->bindParam('name', $name);
$stmt->bindParam('age', $age);


$data = data();
// number of elements in $data['guest']
echo count($data['guest']), " new entries<br />\n";

// add data to mysql database
// iterate over elements in  $data['guest']
foreach( $data['guest'] as $row ) {
    // assign "values" to the previously bound parameters
    $name = $row['name'];
    $age = $row['age'];
    // execute preapred statement
    $stmt->execute();
}
$stmt = null;

// retrieve data: only count
// if you only want count the records do not transfer the data from the mysql server to your php process - use Count(*) instead
$row = $pdo->query('SELECT Count(*) from soFoo')->fetch();
echo $row[0], " entries in database<br />\n";

// retrieve data: actual data
$stmt = $pdo->query('SELECT name, age from soFoo', PDO::FETCH_ASSOC);
foreach( $stmt as $row ) {
    echo $row['name'], ' ', $row['age'], "<br />\n";
}
// stmt->rowCount() after a SELECT statement doesn't work with all pdo drivers, but for PDO_MySQL it does
echo $stmt->rowCount(), ' records fetched';

// boilerplate: create temporary database structure ...
function setup($pdo) {
    $pdo->exec('
        CREATE TEMPORARY TABLE soFoo (
            id int auto_increment,
            name varchar(32),
            age int,
            primary key(id)
        )
    ');
}

// boilerplate: a function returning example data to work on...
function data() {
    return array (
        'guest' => array (
            array (
                'name' => 'Joseph Needham',
                'age' => 53
            ),
            array (
                'name' => 'Lu Gwei-djen',
                'age' => 31
            )
        )
    );
}

edit: given your xml you could do something like

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);

$stmt = $pdo->prepare('INSERT INTO soFoo (name, age) VALUES (:name, :age)');
$stmt->bindParam('name', $name);
$stmt->bindParam('age', $age);

// insert data
$data = data();
echo count($data->guest), " new entries<br />\n";
foreach( $data->guest as $guest ) {
    $name = (string)$guest->name;
    $age = (string)$guest->age;
    $stmt->execute();
}
$stmt = null;

// retrieve data: only count
$row = $pdo->query('SELECT Count(*) from soFoo')->fetch();
echo $row[0], " entries in database<br />\n";

// retrieve data: actual data
$stmt = $pdo->query('SELECT name, age from soFoo', PDO::FETCH_ASSOC);
foreach( $stmt as $row ) {
    echo $row['name'], ' ', $row['age'], "<br />\n";
}
echo $stmt->rowCount(), ' records fetched';


function setup($pdo) {
    $pdo->exec('
        CREATE TEMPORARY TABLE soFoo (
            id int auto_increment,
            name varchar(32),
            age int,
            primary key(id)
        )
    ');
}

function data() {
    // return simplexml_load_file('...');
    return new SimpleXMLElement( <<< eox
<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>
eox
    );
}

output is the same.
But keep in mind that simplxml_load_file() keeps the whole DOM in memory. If your data source gets large that might become a problem and you better switch to XMLReadery,

2 Comments

+1 for the great answer. I edited my question and can you please see that and tell me the solution for the problem how to store the different type of XML result in our database
Rithu, if this answer satisfies your question please mark it as so then. Give VolkerK credits for providing a solution.

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.