Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取XML列表并返回列出次数的值_Php_Xml - Fatal编程技术网

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

Php 获取XML列表并返回列出次数的值,php,xml,Php,Xml,我正在连接到一个XML文件,并试图创建一个列表,该列表显示列出的每个值一次,后跟列出的次数。因此,如果该值在那里显示10次,我需要1个条目,其中包含#10 我的一切正常,但我似乎无法让它更新号码,而不是在列表中添加新条目。有些地方不正确,但我无法像在JS中那样进行测试。(顺便说一下,这是用PHP编写的) XML文件(简化)-每个有更多的条目和更多的,但这应该可以让您了解XML文件的布局 <results> <result date="2016-05-17">

我正在连接到一个XML文件,并试图创建一个列表,该列表显示列出的每个值一次,后跟列出的次数。因此,如果该值在那里显示10次,我需要1个条目,其中包含#10

我的一切正常,但我似乎无法让它更新号码,而不是在列表中添加新条目。有些地方不正确,但我无法像在JS中那样进行测试。(顺便说一下,这是用PHP编写的)

XML文件(简化)-每个
有更多的条目和更多的,但这应该可以让您了解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>