在PHP中将XML转换为数组后未维护数组的顺序
在PHP中使用simplexml_file_load之后,我尝试使用在PHP.NET()中找到的一些代码(XmlToArray())将xml转换为数组,以便处理响应,然后将其发布到给定的URL 但是,XML文档中定义的顺序不是我打印(数组)时数组在终端中的显示方式 有没有办法保持数组中XML中列出的相同顺序?任何帮助/指导都将不胜感激 以下是我的机器本地的xml:在PHP中将XML转换为数组后未维护数组的顺序,php,xml,xml-parsing,Php,Xml,Xml Parsing,在PHP中使用simplexml_file_load之后,我尝试使用在PHP.NET()中找到的一些代码(XmlToArray())将xml转换为数组,以便处理响应,然后将其发布到给定的URL 但是,XML文档中定义的顺序不是我打印(数组)时数组在终端中的显示方式 有没有办法保持数组中XML中列出的相同顺序?任何帮助/指导都将不胜感激 以下是我的机器本地的xml: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<order xmlns="http://www.shutterfly.com/orderv2/order">
<version>2.0</version>
<orderNo>sfly.000020513524-7001536_28935-tb.33</orderNo>
<orderDate>2012-09-21 09:52:53 PDT</orderDate>
<processing>
<statusCallback>http://orderfulfillment.shutterfly.com/ogateway-test/status/sfly/xpressdocs/
</statusCallback>
</processing>
<suborders>
<suborder>
<suborderNo>51917</suborderNo>
<deliveryEstimate>
<earliest>2012-10-01 00:00:00 PDT</earliest>
<latest>2012-10-05 00:00:00 PDT</latest>
</deliveryEstimate>
<greeting>
<line1>Ordered for you by Andrew Mullen on 09/21/12.</line1>
<line2>Save 20% on Holiday Cards November 20 - 30 at Shutterfly
</line2>
</greeting>
<shipAddr>
<name>burkina faso</name>
<address1>1234 burkina road</address1>
<address2></address2>
<city>yako</city>
<region>R21</region>
<postCode></postCode>
<countryCode>BF</countryCode>
<countryName>Burkina Faso</countryName>
</shipAddr>
<shipMethod>INTLSTD</shipMethod>
<additionalFulfillers>false</additionalFulfillers>
<items>
<item>
<itemNo>36</itemNo>
<sku>6X8FLATCARD06</sku>
<description>6x8 Stationery Card - Stacy Claire Boyd</description>
<quantity>1</quantity>
<product>
<stationery>
<formFactor>6x8</formFactor>
<paperFinish>MATTE</paperFinish>
<orientation>LANDSCAPE</orientation>
<image>
<location>http://orderfulfillment.shutterfly.com/fulfillment-test/image/1200/000020513524-7001536_28935--164044--315625--canvas.jpg
</location>
</image>
<boc>
<location>http://orderfulfillment.shutterfly.com/fulfillment-test/image/1200/000020513524-7001536_28935--164044--315626--canvas.jpg
</location>
</boc>
<copyright>
<text>6X8FLATCARD06</text>
</copyright>
</stationery>
</product>
<envelopes>
<envelope>
<toAddress>
<font>
<fontName>Arial</fontName>
<fontSize>12</fontSize>
</font>
<name>FPO Tester</name>
<companyTitle></companyTitle>
<address1>PSC 812 Box 2640</address1>
<address2></address2>
<city>FPO</city>
<region>AE</region>
<postCode>09627</postCode>
<countryCode>USA</countryCode>
<countryName>United States of America</countryName>
</toAddress>
<fromAddress>
<font>
<fontName>Arial</fontName>
<fontSize>12</fontSize>
</font>
<name>Andrew Mullen</name>
<companyTitle></companyTitle>
<address1>2333 W. El Moro Circle</address1>
<address2></address2>
<city>Mesa</city>
<region>AZ</region>
<postCode>85202</postCode>
<countryCode>USA</countryCode>
<countryName>United States of America</countryName>
</fromAddress>
</envelope>
</envelopes>
</item>
</items>
</suborder>
</suborders>
</order>
提前谢谢。注意。当我测试提供的代码时,我发现它与您提供的xml片段配合得很好,但是如果添加了其他项(例如),它会在数组输出中丢失它们 与其调试函数,不如建议您试试这个,它似乎对我很有用: 来自Frederic 2008@
当我测试所提供的代码时,我发现它可以很好地处理您提供的xml片段,但是如果添加了其他项,例如,它会在数组输出中丢失它们 与其调试函数,不如建议您试试这个,它似乎对我很有用: 来自Frederic 2008@
如果xml文件在实时服务器上,请留下它的链接,这样我们就可以很容易地看到xml顺序,然后帮助您实现这一点。很抱歉,我刚刚在这篇文章中添加了xml。感谢您的快速回复。如果xml文件位于实时服务器上,请留下该文件的链接,这样我们就可以很容易地看到xml顺序,然后帮助您实现这一点。很抱歉,我刚刚将xml放在这篇文章中。谢谢你的快速回复。非常感谢。我感谢你的答复和帮助。你好,非常感谢。我感谢你的答复和帮助。当做
function XMLToArray($xml)
{
if ($xml instanceof SimpleXMLElement) {
$children = $xml->children();
$return = null;
}
foreach ($children as $element => $value) {
if ($value instanceof SimpleXMLElement) {
$values = (array) $value->children();
if (count($values) > 0) {
$return[$element] = XMLToArray($value);
} else {
if (!isset($return[$element])) {
$return[$element] = (string) $value;
} else {
if (!is_array($return[$element])) {
$return[$element] = array($return[$element], (string) $value);
} else {
$return[$element][] = (string) $value;
}
}
}
}
}
if (is_array($return)) {
return $return;
} else {
return $false;
}
}
/**
* Parse a SimpleXMLElement object recursively into an Array.
* Attention: attributes skipped
*
*
* @param $xml The SimpleXMLElement object
* @param $arr Target array where the values will be stored
* @return NULL
*/
private function convertXmlObjToArr( $obj, &$arr )
{
$children = $obj->children();
$executed = false;
foreach ($children as $elementName => $node)
{
if( array_key_exists( $elementName , $arr ) )
{
if(array_key_exists( 0 ,$arr[$elementName] ) )
{
$i = count($arr[$elementName]);
$this->convertXmlObjToArr ($node, $arr[$elementName][$i]);
}
else
{
$tmp = $arr[$elementName];
$arr[$elementName] = array();
$arr[$elementName][0] = $tmp;
$i = count($arr[$elementName]);
$this->convertXmlObjToArr($node, $arr[$elementName][$i]);
}
}
else
{
$arr[$elementName] = array();
$this->convertXmlObjToArr($node, $arr[$elementName]);
}
$executed = true;
}
if(!$executed&&$children->getName()=="")
{
$arr = (String)$obj;
}
return ;
}