0

だから私はこの XML をぶらぶらしていて、問題なく移動することができます。動的に作成したいのは、次のような連想配列です。

$keyName => $valName

XML は次のようになります。

<dict>
    <key>Major Version</key><integer>1</integer>
    <key>Minor Version</key><integer>1</integer>
    <key>Application Version</key><string>7.6.1</string>
    <key>Tracks</key>
    <dict>
      <key>0</key>
      <dict>
        <key>Track ID</key><integer>0</integer>
        <key>Name</key><string>American Idol 2013</string>
        <key>Artist</key><string>Amber Holcomb</string>
        <key>Album Artist</key><string>Amber Holcomb</string>
        <key>Album</key><string>Unknown Album</string>
        <key>Kind</key><string>MPEG audio file</string>
        <key>Size</key><integer>3645</integer>
        <key>Total Time</key><integer>233000</integer>
        <key>Date Modified</key><date>Thu Mar 14 12:11:12 2013</date>
        <key>Date Added</key><date>Thu Apr 04 16:10:15 2013</date>
        <key>Bitrate</key><integer>128</integer>
        <key>Location</key><string>file://localhost/Z:%5Canthony%5CMusic%5CiTunes%5CiTunes%20Media%5CMusic%5CUnknown%20Artist%5CUnknown%20Album%5CAmber%20Holcomb%20-%20A%20Moment%20Like%20This%20-%20Studio%20Version%20-%20American%20Idol%202013.mp3</string>
        <key>File Folder Count</key><integer>-1</integer>
        <key>Library Folder Count</key><integer>-1</integer>
      </dict>

これまでのコードで得たものは次のとおりです。

$xml = simplexml_load_file(base_url().'uploads/xmlbackup2.xml');
        $varKey = $xml->dict[0]->dict[0]->dict[0]->children();

        $keyName ="";
        $valName ="";



foreach($xml->dict[0]->dict[0]->dict as $dict1){

            foreach($dict1->children() as $dictChild){

                if($dictChild->getName() == "key"){
                    $keyName = $dictChild;
                } else {
                    $valName = $dictChild;
                }



            }

        }

2 つの配列を作成してそれらをマージしようとするなど、いくつかのことを試しましたが、失敗するだけです。コードが間違っている可能性があります。

基本的に、2 番目のforeachループが完了した後に行うことは、データを SQL にドロップすることです。ただし、コードイグナイターで機能させるには、最初に連想を作成する必要があります。

4

1 に答える 1

2

これはあなたが探しているもののようなものですか?

$myArray = Array();
$currentKey;    
foreach($xml->dict[0] as $dict1){
    foreach($dict1->children() as $dictChild){
        if($dictChild->getName() == "key"){
            $currentKey = $dictChild;
        } else {
            $myArray[(string)$currentKey] = (string)$dictChild;
        }
    }
}

更新 コードをテストしましたが、あなたが受けているという警告を受けていました。文字列へのキャストはそれを修正するようです。以下は、私が作成したサンプルファイルと私が得ている出力です。

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$myArray = Array();
$currentKey;

$xml;
if (file_exists('test.xml'))
    $xml = simplexml_load_file('test.xml');

foreach($xml->dict[0] as $dict1){
    foreach($dict1->children() as $dictChild){
        if($dictChild->getName() == "key"){
            $currentKey = $dictChild;
        } else {
            $myArray[(string)$currentKey] = (string)$dictChild;
        }
    }
}

print '<pre>';
print_r($myArray);
print '</pre>';

?>

Array
(
    [Track ID] => 0
    [Name] => American Idol 2013
    [Artist] => Amber Holcomb
    [Album Artist] => Amber Holcomb
    [Album] => Unknown Album
    [Kind] => MPEG audio file
    [Size] => 3645
    [Total Time] => 233000
    [Date Modified] => Thu Mar 14 12:11:12 2013
    [Date Added] => Thu Apr 04 16:10:15 2013
    [Bitrate] => 128
    [Location] => file://localhost/Z:%5Canthony%5CMusic%5CiTunes%5CiTunes%20Media%5CMusic%5CUnknown%20Artist%5CUnknown%20Album%5CAmber%20Holcomb%20-%20A%20Moment%20Like%20This%20-%20Studio%20Version%20-%20American%20Idol%202013.mp3
    [File Folder Count] => -1
    [Library Folder Count] => -1
)
于 2013-04-09T05:06:55.590 に答える