PHP:如何嵌套两个foreach循环


PHP: How to nest two foreach loops

我是PHP的新手,希望有人能帮我做以下事情:

我有一个SQL表,通过存储过程从中获取数据。这将返回以下XML。然后,在我的PHP页面上,我将这个XML加载为$objCat,以便用下面的脚本在网站上回显它。

到目前为止,这只适用于呼应类别组,而不适用于属于每个组的项目,即具有相同类别的项目。我想我需要在这里嵌套另一个foreach循环(我在下面的注释中),这样它看起来与原始XML相似,但还无法实现。

我的XML:

<ranks>
  <categories>
    <categoryX>Category 1</categoryX>
    <groupCount>3</groupCount>
      <itemID>ID 1</itemID>
        <dateX>2013-11-12</dateX>
        <subjectX>Subject 11</subjectX>
      <itemID>ID 2</itemID>
        <dateX>2013-11-05</dateX>
        <subjectX>Subject 7</subjectX>
      <itemID>ID 3</itemID>
        <dateX>2013-10-23</dateX>
        <subjectX>Subject 2</subjectX>
  </categories>
  <categories>
    <categoryX>Category 2</categoryX>
    <groupCount>2</groupCount>
      <itemID>ID 4</itemID>
        <dateX>2013-11-27</dateX>
        <subjectX>Subject 6</subjectX>
      <itemID>ID 5</itemID>
        <dateX>2013-10-30</dateX>
        <subjectX>Subject 3</subjectX>
    </categoryX>
  </categories>
  // ...
</ranks>

我的PHP:

<?php 
    foreach ($objCat->categories as $cat) { 
        $catGroup = $cat->categoryX; 
        echo $catGroup;
        // echo all itemIDs below each other where categoryX = $catGroup.
    }
?>

假设您只有一个嵌套级别:

$xml = simplexml_load_string($theXML);
foreach ($xml->categories as $cat) { 
    echo "category: 'n";
    foreach ($cat as $key => $value) {
        echo $key . " " . $value."'n";
    }
}

在修复了上面发布的示例xml中不正确的结束标记(</categoryX>)之后,我得到了以下结果:

category: 
categoryX Category 1
groupCount 3
itemID ID 1
dateX 2013-11-12
subjectX Subject 11
itemID ID 2
dateX 2013-11-05
subjectX Subject 7
itemID ID 3
dateX 2013-10-23
subjectX Subject 2
category: 
categoryX Category 2
groupCount 2
itemID ID 4
dateX 2013-11-27
subjectX Subject 6
itemID ID 5
dateX 2013-10-30
subjectX Subject 3

如果您使用simplexml,它应该像…一样直接

foreach ($objCat->categories as $cat) { 
    $catGroup = $cat->categoryX; 
    echo $catGroup;
    $index = 0;
    foreach($cat->itemID as $itemID)
    {
      echo $itemID;
      echo $cat->dateX[$index];
      echo $cat->subjectX[$index];
      $index++;
    }
}

如果您可以控制XML结构,我认为您应该以不同的方式嵌套"子"元素。。。

<categories>
  <categoryX>Category 1</categoryX>
  <groupCount>3</groupCount>
  <childdata>
    <itemID>ID 1</itemID>
    <dateX>2013-11-12</dateX>
    <subjectX>Subject 11</subjectX>
  </childdata>
  <childdata>
    <itemID>ID 2</itemID>
    <dateX>2013-11-05</dateX>
    <subjectX>Subject 7</subjectX>
  </childdata>
  <childdata>
    <itemID>ID 3</itemID>
    <dateX>2013-10-23</dateX>
    <subjectX>Subject 2</subjectX>
  </childdata>
</categories>

然后,对于"childdata"节点的每次迭代,您将有一个包含所有值的单个对象。。。

foreach ($xml->categories as $cat) { 
  $catGroup = $cat->categoryX; 
  echo $catGroup;
  foreach($cat->childdata as $child)
  {
    echo $child->itemID;
    echo $child->dateX;
    echo $child->subjectX;
    $index++;
  }
}