获取XML列表并返回列出的次数值

时间:2016-05-27 02:37:57

标签: php xml

我正在连接到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

2 个答案:

答案 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,因为您直接循环播放数组,因此这样做更清晰。

Example.

答案 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>