2013-02-04 144 views
0

我正在使用XML解析器将xml源数据存储到mysql表中,如果我将XML文件结果作为数组获取,结果如下所示。如何将每个值存储到变量中。将数组内存中的数组存储到PHP变量中

只有这种类型的数组,如果我们使用不同的XML文件或URL,结果可能不是多维数组。

如何数组值存储在PHP变量

<?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> 

任何人都可以帮我解决这个XML解析器结果的问题。在此先感谢

+0

数组有什么问题?这是存储这种类型数据的最佳方式。 PHP中不能有多个$ name变量。之后你想对这些变量做些什么? – Fluitketel

+0

我的问题是如何将这些值存储在这样 的foreach($ arrXml为$行) { } – Rithu

+0

一个PHP变量@Rithu见我的答案。 –

回答

1

使用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 
      ) 
     ) 
    ); 
} 

编辑自给例如:给你的XML,你可以做类似

<?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 
    ); 
} 

输出是一样的。
但请记住,simplxml_load_file()会将整个DOM保留在内存中。如果您的数据源变大,可能会成为问题,您最好切换到XMLReadery,

+0

+1为伟大的答案。我编辑了我的问题,可以请看看,并告诉我如何将不同类型的XML结果存储在我们的数据库 – Rithu

+0

添加修改示例中的问题的解决方案。 – VolkerK

+0

哦很棒的例子。这对我非常有用。非常感谢你:) – Rithu

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... 
} 

希望这可以帮助。

+0

它显示错误为“提供给foreach()在第31行E:\ wamp \ www \ testxml.php中的无效参数” – Rithu

+0

我已经使用了'$ myArray'作为数组。将其替换为您的阵列。 –

+0

我也更换了,但它不起作用。我认为数组数是1.这就是为什么它显示无效的参数。 – Rithu