SimpleXMLElement迭代器PHP

时间:2015-02-26 16:41:36

标签: php

我试图迭代看起来像这样的SimpleXMLElement:

Array
(
    [transactionResultStatus] => SimpleXMLElement Object
    (
    )
    [cardTransactionResult] => SimpleXMLElement Object
    (
        [transactionID] => SimpleXMLElement Object
        (
        )
        [authorizationCode] => SimpleXMLElement Object
        (
        )
        [cvv2ResultCode] => SimpleXMLElement Object
        (
        )
        [roundTripNVPS] => SimpleXMLElement Object
        (
            [roundTripNVP] => SimpleXMLElement Object
            (
                [com.pdc4u.webservices.gps.RoundTripNVP] => SimpleXMLElement Object
                (
                    [rtName] => employee
                    [rtValue] => gomer@gomer.org
                )
            )
        )
    )
    [checkTransactionResult] => SimpleXMLElement Object
    (
    )
    [checkStatusUpdateResult] => SimpleXMLElement Object
    (
        [newStatus] => SimpleXMLElement Object
        (
        )
        [transactionID] => SimpleXMLElement Object
        (
        )
        [roundTripNVPS] => SimpleXMLElement Object
        (
        )
    )
    [transactionErrors] => SimpleXMLElement Object
    (
        [transactionError] => SimpleXMLElement Object
        (
            [webservices.TransactionError] => Array
            (
                [0] => SimpleXMLElement Object
                (
                    [code] => 10003
                    [description] => Value 23 for field Address.ZipPlusFour is not valid.
                )
                [1] => SimpleXMLElement Object
                (
                    [code] => 10003
                    [description] => Value 23 for field Address.ZipPlusFour is not valid.
                )
            )
        )
    )
)

这是我目前用于迭代的内容。我想要做的是消除尽可能多的foreach循环。我可以把它写成递归函数,但我觉得应该有一种更简单有效的方法。

$counter = 0;  
foreach($reporting->results['vendorResponse'] as $key => $value)
{
  if($value->count() != 0)
  {
    foreach($value->children() as $value2)
    {
      if($value2->count() != 0)
      {
        foreach($value2->children() as $value3)
        {
          if($value3->count() != 0)
          {
            foreach($value3->children() as $value4)
            {
              if($value4->count() != 0)
              {
                foreach($value4->children() as $value5)
                {
                  if($value5->count() != 0)
                  {
                    echo "this is extremely inefficient!";
                  }
                  else
                  {
                    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
                            <td style="vertical-align:top;">'.$value5->getName().'</td>
                            <td style="vertical-align:top;">'.$value5.'</td>
                          </tr>';

                    ++$counter;
                  }
                }
              }
              else
              {
                echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
                        <td style="vertical-align:top;">'.$value4->getName().'</td>
                        <td style="vertical-align:top;">'.$value4.'</td>
                      </tr>';

                ++$counter;
              }
            }
          }
          else
          {
            echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
                    <td style="vertical-align:top;">'.$value3->getName().'</td>
                    <td style="vertical-align:top;">'.$value3.'</td>
                  </tr>';

            ++$counter;
          }
        }
      }
      else
      {
        echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
                <td style="vertical-align:top;">'.$value2->getName().'</td>
                <td style="vertical-align:top;">'.$value2.'</td>
              </tr>';

        ++$counter;
      }
    }
  }
  else
  {
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$value->getName().'</td>
            <td style="vertical-align:top;">'.$value.'</td>
          </tr>';

    ++$counter;
  }
}

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

事实证明,simpleXMlElement每次或多或少都是相同的,所以我最终只是硬编码:

$counter = 0;  
$simpleXmlElement = $reporting->results['vendorResponse'];
echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
        <td style="vertical-align:top;">'.$simpleXmlElement['transactionResultStatus']->getName().'</td>
        <td style="vertical-align:top;">'.$simpleXmlElement['transactionResultStatus'].'</td>
      </tr>';
++$counter;
if($_GET['product'] == 'CREDIT')
{    
  echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->transactionID->getName().'</td>
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->transactionID.'</td>
        </tr>';
  ++$counter;
  if($simpleXmlElement['cardTransactionResult']->cardToken->getName() != "")
  {
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->cardToken->getName().'</td>
            <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->cardToken.'</td>
          </tr>';
    ++$counter;
  }
  echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->authorizationCode->getName().'</td>
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->authorizationCode.'</td>
        </tr>';
  ++$counter;
  echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->cvv2ResultCode->getName().'</td>
          <td style="vertical-align:top;">'.$simpleXmlElement['cardTransactionResult']->cvv2ResultCode.'</td>
        </tr>';
  ++$counter;
  foreach($simpleXmlElement['cardTransactionResult']->roundTripNVPS->roundTripNVP->children() as $value)
  {
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$value->rtName.'</td>
            <td style="vertical-align:top;">'.$value->rtValue.'</td>
          </tr>';
    ++$counter;
  }
}
else if($_GET['product'] == 'CHECK')
{
  if($simpleXmlElement['checkTransactionResult']->count() != 0)
  {        
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$simpleXmlElement['checkTransactionResult']->transactionID->getName().'</td>
            <td style="vertical-align:top;">'.$simpleXmlElement['checkTransactionResult']->transactionID.'</td>
          </tr>';
    ++$counter;
    foreach($simpleXmlElement['checkTransactionResult']->roundTripNVPS->roundTripNVP->children() as $value)
    {
      echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
              <td style="vertical-align:top;">'.$value->rtName.'</td>
              <td style="vertical-align:top;">'.$value->rtValue.'</td>
            </tr>';
      ++$counter;
    }
  }
  if($simpleXmlElement['checkStatusUpdateResult']->count() != 0)
  {        
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$simpleXmlElement['checkStatusUpdateResult']->transactionID->getName().'</td>
            <td style="vertical-align:top;">'.$simpleXmlElement['checkStatusUpdateResult']->transactionID.'</td>
          </tr>';
    ++$counter;
    echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
            <td style="vertical-align:top;">'.$simpleXmlElement['checkStatusUpdateResult']->newStatus->getName().'</td>
            <td style="vertical-align:top;">'.$simpleXmlElement['checkStatusUpdateResult']->newStatus.'</td>
          </tr>';
    ++$counter;
    foreach($simpleXmlElement['checkStatusUpdateResult']->roundTripNVPS->roundTripNVP->children() as $value)
    {
      echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
              <td style="vertical-align:top;">'.$value->rtName.'</td>
              <td style="vertical-align:top;">'.$value->rtValue.'</td>
            </tr>';
      ++$counter;
    }
  }
}
foreach($simpleXmlElement['transactionErrors']->transactionError->children() as $value)
{
  echo '<tr class="'.($counter % 2 == 0 ? 'evenrow' : 'oddrow').'">
          <td style="vertical-align:top;">'.$value->code.'</td>
          <td style="vertical-align:top;">'.$value->description.'</td>
        </tr>';
  ++$counter;
}