计算每个类别中的项目 - 在xml分类列表上的php循环

时间:2016-03-29 14:57:51

标签: php xml

我在xml节点上的xml循环中遇到了一个新问题,其中每组项目都包含在类别节点中, 我想做的是:
1-随机获取任意类别中的3个项目 2-获取每个所选项目的父项。

我的XML示例和php在下面的eval中或如下所示: https://eval.in/544360

<?php
$x = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<List>
<category name="cat1" dispName="First Category" catCode="FC1">
    <item itmCode="item1" show="true">
        <name>item 1</name>
        <img>path to image 1</img>
    </item>
    <item itmCode="item2">
        <name>item 2</name>
        <img>path to image 2</img>
    </item>
</category>
<category name="cat2" dispName="Second Category" catCode="SC2">
    <item itmCode="item21">
        <name>item 21</name>
        <img>path to image 21</img>
    </item>
    <item itmCode="item22">
        <name>item 22</name>
        <img>path to image 22</img>
    </item>
    <item itmCode="item54">
        <name>item 54</name>
        <img>path to image 54</img>
    </item>
    <item itmCode="item99">
        <name>item 99</name>
        <img>path to image 99</img>
    </item>
</category>
</List>
XML;

$xml = simplexml_load_string($x); // assume XML in $x
$itemCount=0;
foreach($xml->category->item as $item){
  $itemCount++;
}
echo $itemCount;?>

非常感谢您的帮助和支持

1 个答案:

答案 0 :(得分:1)

您只迭代第一个<category>,它有两个<item>个节点 为了实现你的成果,我建议......

  • 使用xpath()获取XML中所有 $items个节点的数组<item>
  • 使用$items
  • 随机化shuffle()
  • 遍历$items数组并回显每个<item>
  • 再次使用xpath()获取<item>的父级并回显其name - 属性
  • break 3次迭代后的循环

示例代码:

$xml = simplexml_load_string($x); // assume XML in $x
$items = $xml->xpath("/List/category/item");
shuffle($items);

$count = 0;
foreach ($items as $item) {
    echo $item->name . " from category ";
    echo $item->xpath("../@name")[0] . PHP_EOL;

    $count++;
    if ($count >= 3) break;    
} 

在行动中看到它:https://eval.in/545896

评论:

  • xpath()会返回一个SimpleXml - 元素数组,这就是为什么每个$item都可以被视为对象(echo $item->name;)的原因。
  • xpath()可以再次用于检索父(..)及其属性(../@name);请注意@属性。
  • 因为xpath()返回一个数组,所以需要使用[0](第二echo)取消引用。

更新

在PHP&lt; 5.4你应该更新,如果不可能,请像这样取消引用:

$parents = $item->xpath('../@name'); 
echo $parents[0] . PHP_EOL;