【问题标题】:Count XML element over multiple documents within PHP在 PHP 中计算多个文档中的 XML 元素
【发布时间】:2017-06-20 08:05:42
【问题描述】:

我有多个 XML 文档,其中包含来自 API 的输出 - 此输出是来自我们的票务系统的支持票。我正在尝试计算状态设置为特定状态的票。

XML 输出如下所示(尽管在 7 个文档中包含更多请求元素)。

<response uri="/api/xml/getRequestsByView">
<result>
    <status>Success</status>
    <statuscode>200</statuscode>
    <requests>
        <request>
            <form name="requestID">12345</form>
            <form name="userTimeFormat">dd MMM yyyy, HH:mm:ss</form>
            <form name="contact">Name</form>
            <form name="status">Open</form>
            <form name="statusID">1</form>
            <form name="priority">P3 Minor</form>
            <form name="supportRep"/>
            <form name="supportRepCostPerHour">0.00</form>
            <form name="createdTime">20 Jun 2017, 08:22:00</form>
            <form name="updatedTime">20 Jun 2017, 08:23:11</form>
            <form name="dueByTime"/>
            <form name="isOverDue">false</form>
            <form name="accountID"/>
            <form name="account"/>
            <form name="subject">Subject Name</form>
        </request>
        <request>
            <form name="requestID">12346</form>
            <form name="userTimeFormat">dd MMM yyyy, HH:mm:ss</form>
            <form name="contact">Contact Name</form>
            <form name="status">Open</form>
            <form name="statusID">1</form>
            <form name="priority">P3 Minor</form>
            <form name="supportRep"/>
            <form name="supportRepCostPerHour">0.00</form>
            <form name="createdTime">20 Jun 2017, 08:21:58</form>
            <form name="updatedTime">20 Jun 2017, 08:23:10</form>
            <form name="dueByTime"/>
            <form name="isOverDue">false</form>
            <form name="accountID"/>
            <form name="account"/>
            <form name="subject">Subject Name</form>
        </request>
    </requests>
</result>

到目前为止,我创建了以下函数 - 我从下面得到的输出是“1440”。它应该可以工作,因为当我替换 count 元素以回显每个匹配项时,输出显示了每张具有匹配状态的票的状态 - 只是计数元素似乎没有按预期运行。

function countPriority($status){
    $files = array("includes/xml-1.xml","includes/xml-2.xml","includes/xml-3.xml","includes/xml-4.xml","includes/xml-5.xml","includes/xml-6.xml","includes/xml-7.xml");
    $count = 0;
    foreach ($files as $url) {
        $xml = simplexml_load_file($url);
        foreach ($xml->result->requests->request as $request){
            if ($request->form['3'] == $status){
                $count+= count($request);
            }
        }
        return $count;
    }
}

在 PHP/编码方面我是一个完全的新手,所以任何建议或帮助将不胜感激。

【问题讨论】:

  • return移出foreach
  • 已移动 - 感谢您的帮助 :)

标签: php xml foreach count


【解决方案1】:

您这里似乎有错误:$count+= count($request);。如果您只是想计算具有特定状态的票有多少,那么您只需将计数器增加一,例如$count++;。相反,您正在做的是将$count 的值增加每个$request 中的元素数量。

此外,正如 cmets 中所指出的,您应该将 return 语句移出您的 foreach 循环,否则您的方法只会循环遍历数组中的第一个文件。

所以你的方法应该是这样的:

function countPriority($status){
    $files = array("includes/xml-1.xml","includes/xml-2.xml","includes/xml-3.xml","includes/xml-4.xml","includes/xml-5.xml","includes/xml-6.xml","includes/xml-7.xml");
    $count = 0;
    foreach ($files as $url) {
        $xml = simplexml_load_file($url);
        foreach ($xml->result->requests->request as $request){
            if ($request->form['3'] == $status){
                $count++;
            }
        }
    }
    return $count;
}

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多