2013-02-04 2 views
0

XML 구문 분석기를 사용하여 XML 피드 데이터를 mysql 테이블에 저장하고 XML 파일 결과를 배열로 얻으면 결과는 아래와 같습니다. 각 값을 변수에 저장하는 방법.배열 값의 배열을 PHP 변수에 저장합니다.

이 유형의 배열 만이 아닙니다. 다른 XML 파일이나 URL을 사용하면 다차원 배열이 아닐 수 있습니다.

어떻게 내가이 XML 파서 결과 문제를 해결하는 데 도움이 될 수 있습니다

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

누구 PHP 변수에 배열 값을 저장합니다. 미리 감사드립니다.

+0

배열에 어떤 문제가 있습니까? 이 유형의 데이터를 저장하는 가장 좋은 방법입니다. PHP에서는 $ name 변수를 여러 개 가질 수 없습니다. 나중에 그 변수들로 무엇을하고 싶습니까? – Fluitketel

+0

내 질문에 내 대답을 참조하십시오 @Rithu이 의 foreach ($ 행으로 $ arrXml) { } – Rithu

+0

같은 PHP 변수에이 값을 저장하는 방법입니다. –

답변

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

편집을 사용하여 자체 포함 된 예 : 당신이

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

출력처럼 뭔가를 할 수 귀하의 XML 제공은 동일합니다.
그러나 simplexml_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

"31 행의 E : \ wamp \ www \ testxml.php에서 foreach()에 잘못된 인수가 제공되었습니다." – Rithu

+0

'$ myArray'를 배열로 사용했습니다. 어레이로 교체하십시오. –

+0

나는 또한 대체했지만 작동하지 않습니다. 배열 수는 1이라고 생각합니다. 왜 잘못된 인수를 표시하는지. – Rithu

관련 문제