我已经研究了很多将xml文件转换为2d数组的方法与excel在excel中打开xml文件时尝试制作与excel相同的算法.
<items>
<item>
<sku>abc 1</sku>
<title>a book 1</title>
<price>42 1</price>
<attributes>
<attribute>
<name>Number of pages 1</name>
<value>123 1</value>
</attribute>
<attribute>
<name>Author 1</name>
<value>Rob dude 1</value>
</attribute>
</attributes>
<contributors>
<contributor>John 1</contributor>
<contributor>Ryan 1</contributor>
</contributors>
<isbn>12345</isbn>
</item>
<item>
<sku>abc 2</sku>
<title>a book 2</title>
<price>42 2</price>
<attributes>
<attribute>
<name>Number of pages 2</name>
<value>123 2</value>
</attribute>
<attribute>
<name>Author 2</name>
<value>Rob dude 2</value>
</attribute>
</attributes>
<contributors>
<contributor>John 2</contributor>
<contributor>Ryan 2</contributor>
</contributors>
<isbn>6789</isbn>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
我希望它将其转换为二维数组,就像在Excel中打开相同的文件一样,它会向您显示这样的内容
我想像Excel那样转换为二维数组.到目前为止,我可以像Excel一样提取标签
function getColNames($array) {
$cols = array();
foreach($array as $key=>$val) {
if(is_array($val)) {
if($val['type']=='complete') {
if(in_array($val['tag'], $cols)) {
} else {
$cols[] = $val['tag'];
}
}
}
}
return $cols;
}
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
Run Code Online (Sandbox Code Playgroud)
我希望它生成这样的..
array (
0 => array (
'sku'=>'abc 1',
'title'=>'a book 1',
'price'=>'42 1',
'name'=>'Number of Pages 1',
'value'=>'123 1',
'isbn'=>12345
),
1 => array (
'sku'=>'abc 1',
'title'=>'a book 1',
'price'=>'42 1',
'name'=>'Author 1',
'value'=>'Rob dude 1',
'isbn'=>12345
),
2 => array (
'sku'=>'abc 1',
'title'=>'a book 1',
'price'=>'42 1',
'contributor'=>'John 1',
'isbn'=>12345
),
3 => array (
'sku'=>'abc 1',
'title'=>'a book 1',
'price'=>'42 1',
'contributor'=>'Ryan 1',
'isbn'=>12345
),
)
Run Code Online (Sandbox Code Playgroud)
示例2 XML ..
<items>
<item>
<sku>abc 1</sku>
<title>a book 1</title>
<price>42 1</price>
<attributes>
<attribute>
<name>Number of pages 1</name>
<value>123 1</value>
</attribute>
<attribute>
<name>Author 1</name>
<value>Rob dude 1</value>
</attribute>
</attributes>
<contributors>
<contributor>John 1</contributor>
<contributor>Ryan 1</contributor>
</contributors>
<isbns>
<isbn>12345a</isbn>
<isbn>12345b</isbn>
</isbns>
</item>
<item>
<sku>abc 2</sku>
<title>a book 2</title>
<price>42 2</price>
<attributes>
<attribute>
<name>Number of pages 2</name>
<value>123 2</value>
</attribute>
<attribute>
<name>Author 2</name>
<value>Rob dude 2</value>
</attribute>
</attributes>
<contributors>
<contributor>John 2</contributor>
<contributor>Ryan 2</contributor>
</contributors>
<isbns>
<isbn>6789a</isbn>
<isbn>6789b</isbn>
</isbns>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
示例3 XML ..
<items>
<item>
<sku>abc 1</sku>
<title>a book 1</title>
<price>42 1</price>
<attributes>
<attribute>
<name>Number of pages 1</name>
<value>123 1</value>
</attribute>
<attribute>
<name>Author 1</name>
<value>Rob dude 1</value>
</attribute>
</attributes>
<contributors>
<contributor>John 1</contributor>
<contributor>Ryan 1</contributor>
</contributors>
<isbns>
<isbn>
<name>isbn 1</name>
<value>12345a</value>
</isbn>
<isbn>
<name>isbn 2</name>
<value>12345b</value>
</isbn>
</isbns>
</item>
<item>
<sku>abc 2</sku>
<title>a book 2</title>
<price>42 2</price>
<attributes>
<attribute>
<name>Number of pages 2</name>
<value>123 2</value>
</attribute>
<attribute>
<name>Author 2</name>
<value>Rob dude 2</value>
</attribute>
</attributes>
<contributors>
<contributor>John 2</contributor>
<contributor>Ryan 2</contributor>
</contributors>
<isbns>
<isbn>
<name>isbn 3</name>
<value>6789a</value>
</isbn>
<isbn>
<name>isbn 4</name>
<value>6789b</value>
</isbn>
</isbns>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
为了从您提供的 xml 文件中获取您想要的数组,您必须这样做。这并不是太有趣,所以我希望这确实是您想要的。
给定您所提供的确切 XML,将产生您的最终结果输出。
这是用 php 5.6 编写的,我相信如果您在环境中遇到问题,您将必须将函数调用移至其自己的行并用 array() 替换 [] 。
$items = simplexml_load_file("items.xml");
$items_array = [];
foreach($items as $item) {
foreach($item->attributes->attribute as $attribute) {
array_push($items_array, itemsFactory($item, (array) $attribute));
}
foreach((array) $item->contributors->contributor as $contributer) {
array_push($items_array, itemsFactory($item, $contributer));
}
}
function itemsFactory($item, $vars) {
$item = (array) $item;
return [
"sku" => $item['sku'],
"title" => $item['title'],
"price" => $item['price'],
"name" => (is_array($vars) ? $vars['name'] : ""),
"value" => (is_array($vars) ? $vars['name'] : ""),
"contributer" => (is_string($vars) ? $vars : ""),
"isbn" => $item['isbn']
];
}
var_dump($items_array);
Run Code Online (Sandbox Code Playgroud)
这是在 XML 文件上运行时的结果...
array(8) {
[0]=>
array(7) {
["sku"]=>
string(5) "abc 1"
["title"]=>
string(8) "a book 1"
["price"]=>
string(4) "42 1"
["name"]=>
string(17) "Number of pages 1"
["value"]=>
string(17) "Number of pages 1"
["contributer"]=>
string(0) ""
["isbn"]=>
string(5) "12345"
}
[1]=>
array(7) {
["sku"]=>
string(5) "abc 1"
["title"]=>
string(8) "a book 1"
["price"]=>
string(4) "42 1"
["name"]=>
string(8) "Author 1"
["value"]=>
string(8) "Author 1"
["contributer"]=>
string(0) ""
["isbn"]=>
string(5) "12345"
}
[2]=>
array(7) {
["sku"]=>
string(5) "abc 1"
["title"]=>
string(8) "a book 1"
["price"]=>
string(4) "42 1"
["name"]=>
string(0) ""
["value"]=>
string(0) ""
["contributer"]=>
string(6) "John 1"
["isbn"]=>
string(5) "12345"
}
[3]=>
array(7) {
["sku"]=>
string(5) "abc 1"
["title"]=>
string(8) "a book 1"
["price"]=>
string(4) "42 1"
["name"]=>
string(0) ""
["value"]=>
string(0) ""
["contributer"]=>
string(6) "Ryan 1"
["isbn"]=>
string(5) "12345"
}
[4]=>
array(7) {
["sku"]=>
string(5) "abc 2"
["title"]=>
string(8) "a book 2"
["price"]=>
string(4) "42 2"
["name"]=>
string(17) "Number of pages 2"
["value"]=>
string(17) "Number of pages 2"
["contributer"]=>
string(0) ""
["isbn"]=>
string(4) "6789"
}
[5]=>
array(7) {
["sku"]=>
string(5) "abc 2"
["title"]=>
string(8) "a book 2"
["price"]=>
string(4) "42 2"
["name"]=>
string(8) "Author 2"
["value"]=>
string(8) "Author 2"
["contributer"]=>
string(0) ""
["isbn"]=>
string(4) "6789"
}
[6]=>
array(7) {
["sku"]=>
string(5) "abc 2"
["title"]=>
string(8) "a book 2"
["price"]=>
string(4) "42 2"
["name"]=>
string(0) ""
["value"]=>
string(0) ""
["contributer"]=>
string(6) "John 2"
["isbn"]=>
string(4) "6789"
}
[7]=>
array(7) {
["sku"]=>
string(5) "abc 2"
["title"]=>
string(8) "a book 2"
["price"]=>
string(4) "42 2"
["name"]=>
string(0) ""
["value"]=>
string(0) ""
["contributer"]=>
string(6) "Ryan 2"
["isbn"]=>
string(4) "6789"
}
}
Run Code Online (Sandbox Code Playgroud)
如果您实际上可以访问 excel 文件而不是 xml,这可能会容易得多。如果是这样,我们可以使用 php excel 来渲染完全相同的东西,但它适用于任何数据集,而不仅仅是指定的数据集。如果不是这种情况,我想不出任何其他方法将该 xml 文件转换为您想要的内容。
编辑:
这也可能会给这个主题带来一些更多的启发,来自 PHPExcel 的开发者本人PHPExcel 工厂从 URL 读取 XML 时出错。我不认为你能够编写一些东西来解析你扔给它的任何 XML 文件,而无需掌握一些 Excels 源代码或花费很长时间来处理这个问题。超出了这个问题的范围。然而,如果您要编写一些可以解析任何 XML 文件的东西,我有一种感觉,它看起来像上面的内容,但带有大量条件。