首页 > 解决方案 > PHP Foreach 保存 ID

问题描述

我有所谓的“GAEB”文件,它们是 XML 结构的。我通过 foreach 和 simplexml 遍历这些。

XML/GAEB 文件:

<GAEB>
  <Award>
    <BoQ>
      <BoQBody>
        <BoQCtgy RNoPart="01">
          <BoQBody>
            <BoQCtgy RNoPart="01">
              <BoQBody>
                <BoQCtgy>
                  <BoQBody RNoPart="01">
                    <Itemlist>
                      <Item RNoPart="1">
                      <Item RNoPart="2">
                    </Itemlist>
                  </BoQBody>
                </BoQCtgy>
                <BoQCtgy>
                  <BoQBody RNoPart="02">
                    <Itemlist>
                      <Item RNoPart="1">
                      <Item RNoPart="2">
                    </Itemlist>
                  </BoQBody>
                </BoQCtgy>
              </BoQBody>
            </BoQCtgy>
            <BoQCtgy RNoPart="02">
              <BoQBody>
                <BoQCtgy>
                  <BoQBody RNoPart="01">
                    <Itemlist>
                      <Item RNoPart="1">
                      <Item RNoPart="2">
                    </Itemlist>
                  </BoQBody>
                </BoQCtgy>
                <BoQCtgy>
                  <BoQBody RNoPart="02">
                    <Itemlist>
                      <Item RNoPart="1">
                      <Item RNoPart="2">
                    </Itemlist>
                  </BoQBody>
                </BoQCtgy>
              </BoQBody>
            </BoQCtgy>
          </BoQBody>
        </BoQCtgy>
      </BoQBody>
    </BoQ>
  </Award>
</GAEB>

我的 PHP 代码循环遍历所有 $xml->BoQBody->BoQCtgy 直到找到一个 Itemlist。然后遍历该 Itemlist 并从那里获取一些信息。之后再次开始循环。

PHP:

<?php
$file = "pathtoxmlfile";
$xml = simplexml_load_file($file);

function loop($path, $xml){
  foreach($path->BoQBody->BoQCtgy as $BoQCtgy){
    $nr = $BoQCtgy->attributes()["RNoPart"];
    echo $nr;      

    if(ISSET($BoQCtgy->BoQBody->Itemlist) === TRUE{
      foreach($BoQCtgy->BoQBody->Itemlist->Item as $item){
        $pos = $item->attributes()["RNoPart"];
        echo $pos;
      }
    }
  }
  loop($BoQCtgy,$xml);
}

loop($xml->Award->BoQ,$xml);
?>

我如何获得所有职位的清晰编号?上面的例子应该是:

01
01.01
01.01.01
01.01.01.1
01.01.01.2
01.01.02
01.01.02.1
01.01.02.2

问题是,深度每次都是另一个。我使用 PHP 代码获得了我需要的所有位置和所有值,没有任何问题。但是我找不到匹配的编号...

希望有人知道解决方案。

标签: phpxml

解决方案


使用 XPath,您不必担心项目的深度。在这种情况下,它首先使用...查找具有RNoPart属性的任何节点//*[@RNoPart]

  • // - 任何级别
  • 任何节点
  • [@RNoPart] - 带有 RNoPart 属性(@表示属性)

它循环遍历结果,然后使用ancestorXPath 中的轴来查找具有另一个 RNoPart 属性的所有父元素,使用ancestor::*/@RNoPart.

当它循环这些(在本例中)时,它只输出值,然后.在每个子集之后加上 a 和一个新行。

所以放在一起,你得到...

foreach ( $xml->xpath("//*[@RNoPart]") as $part )   {
    foreach ( $part['RNoPart']->xpath("ancestor::*/@RNoPart") as $part )   {
        echo $part.".";
    }
    echo PHP_EOL;
}

并使用您的示例 XML,输出...

01.
01.01.
01.01.01.
01.01.01.1.
01.01.01.2.
01.01.02.
01.01.02.1.
01.01.02.2.
01.02.
01.02.01.
01.02.01.1.
01.02.01.2.
01.02.02.
01.02.02.1.
01.02.02.2.

推荐阅读