2013-02-04 143 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