PHP:如何嵌套两个foreach循环

时间:2013-12-01 22:06:09

标签: php xml foreach nested-loops nested

我对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.
    }
?>

2 个答案:

答案 0 :(得分:2)

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

$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

答案 1 :(得分:1)

如果你唱的是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++;
  }
}