我确实有以下XML数据:
<schedule>
<event>
<date>2017-08-25</date>
<time>16:00</time>
</event>
<event>
<date>2017-08-25</date>
<time>20:00</time>
</event>
<event>
<date>2017-08-26</date>
<time>16:00</time>
</event>
<event>
<date>2017-08-26</date>
<time>20:00</time>
</event>
</event>
<event>
<date>2017-08-27</date>
<time>20:00</time>
</event>
</schedule>
使用以下循环输出数据:
<?php $xml = simplexml_load_file('events.xml'); ?>
<?php foreach ( $xml->event as $event ) { ?>
<dl>
<dt>
<?php echo $event->date; ?>
</dt>
<dd>
<?php echo $event->time; ?>
</dd>
</dl>
<?php } ?>
结果是:
<dl>
<dt>2017-08-25</dt>
<dd>16:00</dd>
</dl>
<dl>
<dt>2017-08-25</dt>
<dd>20:00</dd>
</dl>
<dl>
<dt>2017-08-26</dt>
<dd>16:00</dd>
</dl>
等
但是知道我想按日期订购时间,以获得此输出:
<dl>
<dt>2017-08-25</dt>
<dd>16:00</dd>
<dd>20:00</dd>
</dl>
<dl>
<dt>2017-08-26</dt>
<dd>16:00</dd>
<dd>20:00</dd>
</dl>
等
有没有办法修改循环,得到这个结果?我非常感谢你的帮助!
答案 0 :(得分:1)
考虑XSLT,这是用于转换XML文件的专用语言,因为您实际需要的是一个名为Muenchian Grouping的XSLT 1.0方法,您可以使用文档键对节点进行分组并检索或操作所有相应的值。
PHP可以使用其php-xsl扩展名运行XSLT 1.0脚本(确保在.ini文件中启用)。使用此方法,不需要foreach
循环或if
逻辑。
XSLT 脚本(另存为.xsl文件,可以像任何XML一样处理的特殊.xml文件)
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:key name="eventid" match="event" use="date" />
<xsl:template match="/schedule">
<root>
<xsl:apply-templates select="event"/>
</root>
</xsl:template>
<xsl:template match="event">
<dl>
<xsl:for-each select=".[generate-id() = generate-id(key('eventid', date)[1])]">
<dt><xsl:value-of select="date"/></dt>
<xsl:for-each select="key('eventid', date)">
<dd><xsl:value-of select="time"/></dd>
</xsl:for-each>
</xsl:for-each>
</dl>
</xsl:template>
</xsl:transform>
PHP (引用上面的.xsl文件)
// LOAD XML AND XSL
$xml = new DOMDocument();
$xml->load('Input.xml'); // OR $xml->loadXML($xmlstring);
$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl'); // OR $xsl->loadXML($xslstring);
// INITIALIZE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// RUN TRANSFORMATION
$newXML = $proc->transformToXML($xml);
// ECHO STRING OUTPUT
echo $newXML;
// SAVE OUTPUT TO FILE
file_put_contents('Output.xml', $newXML);
输出(online transform)
<root>
<dl>
<dt>2017-08-25</dt>
<dd>16:00</dd>
<dd>20:00</dd>
</dl>
<dl/>
<dl>
<dt>2017-08-26</dt>
<dd>16:00</dd>
<dd>20:00</dd>
</dl>
<dl/>
<dl>
<dt>2017-08-27</dt>
<dd>20:00</dd>
</dl>
</root>