0

XML パーサーを使用して xml フィード データを mysql テーブルに格納しています。XML ファイルの結果を配列として取得した場合、結果は以下のようになります。各値を変数に格納する方法。

このタイプの配列のみではなく、別の 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 パーサーの結果の問題を解決するのを手伝ってくれます。前もって感謝します

4

2 に答える 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...
}

お役に立てれば。

于 2013-02-04T07:37:35.187 に答える
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に切り替えることをお勧めします。

于 2013-02-04T07:44:03.927 に答える