【问题标题】:how to parse xml file using simplexml and create multidimensional array in PHP如何使用 simplexml 解析 xml 文件并在 PHP 中创建多维数组
【发布时间】:2014-03-27 15:25:17
【问题描述】:

我正在尝试解析如下的 xml 文件以创建多维数组。

 <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
           ) 
           .........
       )

    )
)

相当有挑战性。应该如何修改代码才能达到目标?

【问题讨论】:

    标签: php arrays multidimensional-array xml-parsing simplexml


    【解决方案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;
    

    【讨论】:

    • 您想通过这些更改实现什么目标?...至少我的代码有所收获。你能解释一下吗?
    • 对不起@nohan,我忘了把 $i 放在内部 foreach 中。需要将元素转换为字符串,我不确定我现在放入的转换为字符串是否也是最正确的方法,但请尝试告诉我。
    • 再次抱歉,我现在修好了,再试一次。
    • 我把鳕鱼改成了你期望的样子。如果您喜欢该解决方案,请不要忘记投票;)。
    【解决方案2】:

    您不能在数组(选项卡)中多次使用相同的键,因此需要将其更改为唯一值。

    此外,您的 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);
    

    【讨论】:

    • 表有数百行:(
    • 你能改变表格的格式吗?格式是第 1 行 - 标签,第 2 行 - 标签,第 3 行 - 第 1 行的值,第 4 行 - 第 2 行的值,这似乎很奇怪
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多