2014-03-27 36 views
0

我試圖解析如下一個XML文件來創建一個多維數組。如何使用SimpleXML解析XML文件並創建多維數組在PHP

<workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" > 
<Worksheet ss:Name="45"> 
    <Table> 
     <Row><Cell><Data>232</Data></Cell></Row> 
    <Row><Cell><Data>Apple</Data></Cell></Row> 
    </Table> 
</Worksheet> 
<Worksheet ss:Name="46 - new"> 
    <Table> 
     <Row><Cell><Data>876</Data></Cell></Row> 
    <Row><Cell><Data>samsung</Data></Cell></Row> 
    </Table> 
</Worksheet> 

下面是代碼迄今。

$xml=simplexml_load_file($xmlfile); 
$result= array(); 
foreach($xml->Worksheet as $worksheet) { 
    $result['tab']['name'][]=$worksheet->attributes('ss', TRUE)->Name; 
    foreach($worksheet as $table){ 
    foreach($table as $row){ 
     foreach($row as $cell){ 
     $result['tab']['units'][]=$cell->Data; 
     } 
    } 
    } 
} 

print_r($result); 

我試圖讓數組如下:

items =[ 
    tab=>[ 
    'name' => '45', 
    'units'=>[ 
     ['0'=>'232'], 
     ['1'=>'Apple'] 
    ] 
    ] 
    tab=>[ 
    'name' => '46-new', 
    'units'=>[ 
     ['0'=>'876'], 
     ['1'=>'samsung'] 
    ] 
    ] 
]; 

但我得到如下結果。

array(
    [tab]=>array(
     [name]=>array 
     (
      [0]=>SimpleXmlElement Object 
      ( 
      [0]=> 45 
      ) 
      [1]=>SimpleXmlElement object 
      ( 
      [1]=>46-new 
      ) 
     ) 
     [units]=>array 
     (
      [0]=>SimpleXmlElement Object 
      ( 
      [0]=> Nr 
      ) 
      [1]=>SimpleXmlElement object 
      ( 
      [0]=>model 
      ) 
      [2]=>SimpleXmlElement Object 
      ( 
      [0]=> 232 
      ) 
      [3]=>SimpleXmlElement object 
      ( 
      [0]=>apple 
      ) 
      ......... 
     ) 

    ) 
) 

這非常具有挑戰性。如何修改代碼以實現目標?

回答

1

你可以嘗試做的代碼如下:

$xmlfile = 'xmlfile.xml'; 
$xml=simplexml_load_file($xmlfile); 
$result= array(); 
$i=0; 
foreach($xml->Worksheet as $worksheet) { 
$i++; 
$result['tab'][$i] = array(); 
$result['tab'][$i]['name']=(string) $worksheet->attributes("ss", true)->Name; 
$pos=0; 
$key = ''; 
foreach($worksheet as $table){ 
    foreach($table as $row){ 
     foreach($row as $cell){ 
     $result['tab'][$i]['units'][] = array("" + $pos => (string) $cell->Data); 
     $pos++; 
     } 
    } 
    } 
} 

return $result; 
+0

你想這些變化給achieeve什麼辦法呢?......至少我是越來越有我的代碼的東西。你能解釋一下嗎?plz – nohan

+0

變化後我只得到最後一個單位? – nohan

+0

對不起@nohan,我忘了把$ i放在內在的foreach中。有必要將元素轉換爲字符串,我不確定現在放入的字符串是否是最正確的方法,但請嘗試告訴我。 – Zini

0

不能使用相同的密鑰的陣列(標籤)不止一次,這樣就需要改變成爲一個獨特的價值。

而且,你的XML佈局本身不適合以及通過它循環像你有。如果你認爲你的桌子總是有4排,那麼你可以做這個工作。

嘗試這樣的事情...

$xml=simplexml_load_file($xmlfile); 
$result= array(); 
foreach($xml->Worksheet as $key=>$worksheet) { 
    $result['tab'.($key+1)]['name']=$worksheet->attributes('ss', TRUE)->Name; 
    foreach($worksheet as $table){ 
    $label1 = $table[0][0][0]; // row 0, cell 0, data 0 
    $label2 = $table[1][0][0]; // row 1, cell 0, data 0 
    $value1 = $table[2][0][0]; // row 2, cell 0, data 0 
    $value2 = $table[3][0][0]; // row 3, cell 0, data 0 
    $result['tab'.($key+1)]['units'][$label1]=$value1; 
    $result['tab'.($key+1)]['units'][$label2]=$value2; 
    } 
} 

print_r($result); 
+0

表有數百行:( – nohan

+0

您可以更改表的格式似乎很奇怪的是,格式爲1列 - 標籤,行2 - 標籤,行3 - 用於行1的值,第4行 - 值2行 –