Php 获取XML列表并返回列出次数的值
我正在连接到一个XML文件,并试图创建一个列表,该列表显示列出的每个值一次,后跟列出的次数。因此,如果该值在那里显示10次,我需要1个条目,其中包含#10 我的一切正常,但我似乎无法让它更新号码,而不是在列表中添加新条目。有些地方不正确,但我无法像在JS中那样进行测试。(顺便说一下,这是用PHP编写的) XML文件(简化)-每个Php 获取XML列表并返回列出次数的值,php,xml,Php,Xml,我正在连接到一个XML文件,并试图创建一个列表,该列表显示列出的每个值一次,后跟列出的次数。因此,如果该值在那里显示10次,我需要1个条目,其中包含#10 我的一切正常,但我似乎无法让它更新号码,而不是在列表中添加新条目。有些地方不正确,但我无法像在JS中那样进行测试。(顺便说一下,这是用PHP编写的) XML文件(简化)-每个有更多的条目和更多的,但这应该可以让您了解XML文件的布局 <results> <result date="2016-05-17">
有更多的条目和更多的,但这应该可以让您了解XML文件的布局
<results>
<result date="2016-05-17">
<row>
<label>www.url1.com</label>
</row>
<row>
<label>www.url2.com</label>
</row>
</result>
<result date="2016-05-19">
<row>
<label>www.url1.com</label>
</row>
</result>
</results>
您可能会发现,您在诊断代码中的问题时遇到了困难,因为它所做的工作过于复杂。通过URL本身为
$refferer\u URL
[sic]数组编制索引,只需将数量存储为值,即可大大简化逻辑,例如:
foreach ($refferers->result as $result) {
if (!$result->row[0]) {
continue;
}
foreach ($result->row as $refferal) {
$the_url = (string) $refferal->label;
// Initialize the key
if (!array_key_exists($the_url, $refferer_urls)) {
$refferer_urls[$the_url] = 0;
}
// Increment the count for it
$refferer_urls[$the_url]++;
}
}
foreach ($refferer_urls as $url => $quantity) {
$refferer_html .= '<table>
<tr valign="top">
<td scope="row" width="75%">
<label for="tablecell"><strong>' . $url . '</strong></label></td>
<td>' . $quantity . '</td>
</tr>
</table>';
}
foreach($refferers->result as$result){
如果(!$result->行[0]){
继续;
}
foreach($result->行作为$refferal){
$theu url=(字符串)$refferal->label;
//初始化密钥
如果(!array\u key\u存在($the\u url,$refferer\u url)){
$refferer\u url[$the\u url]=0;
}
//增加它的计数
$refferer_url[$the_url]++;
}
}
foreach($url=>$quantity的引用url){
$refferer\u html.='
。$url.
“.$数量。”
';
}
请注意,我还调整了代码中的间距,并使用了continue
,而不是在第一个foreach
开头使用另一个缩进级别。我还在第二个循环中将while
替换为foreach
,因为您直接循环数组,所以这样做更干净
考虑一个更简单的解决方案,它是一种专门设计用于将XML文件甚至转换为HTML的专用语言。下面使用Muenchian方法(XSLT1.0中使用索引的流行、高效的分组方法)来计算
值。与大多数通用语言一样,PHP维护XSLT1.0处理器。在此解决方案中,不使用循环:
XSLT脚本(另存为下面要使用的.xsl文件)
PHP脚本
// LOAD XML AND XSL SOURCES
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');
$xslfile = new DOMDocument('1.0', 'UTF-8');
$xslfile->load('Transform.xsl');
// TRANFORM SOURCE WITH XSL
$proc = new XSLTProcessor;
$proc->importStyleSheet($xslfile);
$newXml = $proc->transformToXML($xml);
// ECHO STRING OUTPUT
echo $newXml;
// <table>
// <tr valign="top">
// <td scope="row" width="75%">
// <label for="tablecell">
// <strong>www.url1.com</strong>
// </label>
// </td>
// <td scope="row" width="75%">2</td>
// </tr>
// <tr valign="top">
// <td scope="row" width="75%">
// <label for="tablecell">
// <strong>www.url2.com</strong>
// </label>
// </td>
// <td scope="row" width="75%">1</td>
// </tr>
// </table>
//加载XML和XSL源
$xml=新的DOMDocument('1.0','UTF-8');
$xml->load('Input.xml');
$xslfile=newDOMDocument('1.0','UTF-8');
$xslfile->load('Transform.xsl');
//使用XSL转换源代码
$proc=新的XSLTProcessor;
$proc->importStyleSheet($xslfile);
$newXml=$proc->transformToXML($xml);
//回显字符串输出
echo$newXml;
//
//
//
//
//www.url1.com
//
//
// 2
//
//
//
//
//www.url2.com
//
//
// 1
//
//
您只需计算url
's?的数量,只需在循环中使用好的ol'$myarray[$the_url]['count']+
重新分配密钥对即可
foreach ($refferers->result as $result) {
if (!$result->row[0]) {
continue;
}
foreach ($result->row as $refferal) {
$the_url = (string) $refferal->label;
// Initialize the key
if (!array_key_exists($the_url, $refferer_urls)) {
$refferer_urls[$the_url] = 0;
}
// Increment the count for it
$refferer_urls[$the_url]++;
}
}
foreach ($refferer_urls as $url => $quantity) {
$refferer_html .= '<table>
<tr valign="top">
<td scope="row" width="75%">
<label for="tablecell"><strong>' . $url . '</strong></label></td>
<td>' . $quantity . '</td>
</tr>
</table>';
}
<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="labelkey" match="result/row" use="label" />
<xsl:template match="results">
<table>
<xsl:apply-templates select="result/row[generate-id() =
generate-id(key('labelkey',label)[1])]"/>
</table>
</xsl:template>
<xsl:template match="result/row[generate-id() = generate-id(key('labelkey',label)[1])]">
<tr valign="top">
<td scope="row" width="75%">
<label for="tablecell">
<strong>
<xsl:value-of select="label"/>
</strong>
</label>
</td>
<td scope="row" width="75%">
<xsl:value-of select="count(. | key('labelkey', label))"/>
</td>
</tr>
</xsl:template>
</xsl:transform>
// LOAD XML AND XSL SOURCES
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');
$xslfile = new DOMDocument('1.0', 'UTF-8');
$xslfile->load('Transform.xsl');
// TRANFORM SOURCE WITH XSL
$proc = new XSLTProcessor;
$proc->importStyleSheet($xslfile);
$newXml = $proc->transformToXML($xml);
// ECHO STRING OUTPUT
echo $newXml;
// <table>
// <tr valign="top">
// <td scope="row" width="75%">
// <label for="tablecell">
// <strong>www.url1.com</strong>
// </label>
// </td>
// <td scope="row" width="75%">2</td>
// </tr>
// <tr valign="top">
// <td scope="row" width="75%">
// <label for="tablecell">
// <strong>www.url2.com</strong>
// </label>
// </td>
// <td scope="row" width="75%">1</td>
// </tr>
// </table>