Reputation: 1289
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
Upvotes: 0
Views: 1653
Reputation: 96159
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,
Upvotes: 1
Reputation: 6003
// 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.
Upvotes: 2