我正在连接到XML文件并尝试创建一个列表,该列表显示列出的每个值,然后列出它的列出次数。因此,如果值显示在那里10次,我希望1条输入#10。
我有一切正常,但我似乎无法更新数字而不是在列表中添加新条目。有些事情是不正确的,但我无法像在JS中那样试探它。 (顺便说一下,这是PHP)
XML文件(简体) - 每个<result>
还有更多的条目包含更多条目,但这应该可以了解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>
PHP
$refferers = simplexml_load_file('https://url.com');
$refferer_urls = array( );
$refferer_html = '';
foreach ($refferers->result as $result) {
if ($result->row[0]) {
foreach($result->row as $refferal) {
$the_url = $refferal->label;
if( go_refferer_exsists( $refferer_urls, $the_url ) ) {
for($i = 0; $i < count($refferer_urls); $i++) {
if( $refferer_urls[$i]["url"] == $the_url ) {
$refferer_urls[$i]["quantity"]++;
}
}
} else {
array_push($refferer_urls, array(
"url" => $the_url,
"quantity" => 1,
));
}
}
}
}
for($i = 0; $i < count($refferer_urls); $i++) {
$refferer_html .= '<table>
<tr valign="top">
<td scope="row" width="75%">
<label for="tablecell"><strong>' . $refferer_urls[$i]["url"] . '</strong></label></td>
<td>' . $refferer_urls[$i]["quantity"] . '</td>
</tr>
</table>';
}
function go_refferer_exsists($the_array, $value) {
for($i = 0; $i < count($the_array); $i++) {
if ( $the_array[$i]["url"] == $value ) {
return true;
}
}
return false;
}
RETURNS
www.url1.com 1
www.url2.com 1
www.url1.com 1
答案 0 :(得分:2)
可能您会发现您在代码中诊断问题时遇到了困难,因为它对于它所做的事情来说过于复杂。您可以通过URL本身索引$refferer_urls
[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>';
}
请注意,我还调整了代码中的间距并使用了continue
,而不是在第一个foreach
开头的另一个缩进级别。我还在第二个循环中将while
替换为foreach
,因为您直接循环播放数组,因此这样做更清晰。
答案 1 :(得分:0)
使用XSLT来考虑一个更简单的解决方案,https://ndb.nal.usda.gov/ndb/doc/apilist/API-FOOD-REPORT.md是专门用于转换XML文件甚至HTML的专用语言。下面使用Muenchian方法(使用索引在XSLT 1.0中流行,高效的分组方法)来计算<label>
值。像大多数通用语言一样,PHP维护着一个XSLT 1.0处理器。在此解决方案中,不使用循环:
XSLT 脚本(另存为以下使用的.xsl文件)
<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>
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>