2011-07-14 504 views
1

我正在查詢API並獲取XML結果。我正在嘗試將這些結果記錄下來,並根據他們的狀態將其粘貼到一張表格中。每列都是不同的狀態,所以他們需要進入各自的列。我遇到的問題是當我有多個項目返回相同的狀態。我相信這正在打破循環。我收到了一些沒有出現的項目和一些正在重複的項目。任何想法如何我可以實現我在找什麼?謝謝!!foreach循環中的PHP變量

更新與示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Assets total="6"> 
    <Asset> 
     <Attribute name="ID">B-1001</Attribute> 
     <Attribute name="Title">Some Bug #1</Attribute> 
     <Attribute name="Status">In Progress</Attribute> 
    </Asset> 
    <Asset> 
     <Attribute name="ID">B-1002</Attribute> 
     <Attribute name="Title">Some Bug #2</Attribute> 
     <Attribute name="Status">Code Review</Attribute> 
    </Asset> 
    <Asset> 
     <Attribute name="ID">B-1003</Attribute> 
     <Attribute name="Title">Some Bug #3</Attribute> 
     <Attribute name="Status">Code Review</Attribute> 
    </Asset> 
    <Asset> 
     <Attribute name="ID">B-1004</Attribute> 
     <Attribute name="Title">Some Bug #4</Attribute> 
     <Attribute name="Status">Ready for Development</Attribute> 
    </Asset> 
    <Asset> 
     <Attribute name="ID">B-1005</Attribute> 
     <Attribute name="Title">Some Bug #5</Attribute> 
     <Attribute name="Status">In Progress</Attribute> 
    </Asset> 
    <Asset> 
     <Attribute name="ID">B-1006</Attribute> 
     <Attribute name="Title">Some Bug #6</Attribute> 
     <Attribute name="Status">In Progress</Attribute> 
    </Asset> 


<?php 
foreach($xmlDefect as $assetDefect){ 
    // variables from defects XML 
    $defectId = $assetDefect->Attribute[0]; 
    $defectTitle = $assetDefect->Attribute[1]; 
    $defectStatus = $assetDefect->Attribute[2]; 
    if($defectStatus == "Gathering Requirements"){ 
     $defectGatheringReqs = "<div class='bugsItem'>" . $defectId . "</div>"; 
    }else if($defectStatus == "Ready for Development"){ 
     $defectReadyForDev = "<div class='bugsItem'>" . $defectId . "</div>"; 
    }else if($defectStatus == "In Progress"){ 
     $defectInProgress = "<div class='bugsItem'>" . $defectId . "</div>"; 
    }else if($defectStatus == "Code Review"){ 
     $defectAEReview = "<div class='bugsItem'>" . $defectId . "</div>"; 
    }else if($defectStatus == "Code Complete"){ 
     $defectCodeComplete = "<div class='bugsItem'>" . $defectId . "</div>"; 
    } 
} 
?> 
<table> 
    <tr> 
     <td> 
      Gathering Requirements 
     </td> 
     <td> 
      Ready for Development 
     </td> 
     <td> 
      In Progress 
     </td> 
     <td> 
      Code Review 
     </td> 
     <td> 
      Code Complete 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <?php echo $defectGatheringReqs; ?> 
     </td> 
     <td> 
      <?php echo $defectReadyForDev; ?> 
     </td> 
     <td> 
      <?php echo $defectInProgress; ?> 
     </td> 
     <td> 
      <?php echo $defectAEReview; ?> 
     </td> 
     <td> 
      <?php echo $defectCodeComplete; ?> 
     </td> 
    </tr> 
</table> 
+0

你可以發佈'$ xmlDefect'內容的例子嗎? –

+0

您似乎在您的foreach循環中缺少結束標記。 – jisaacstone

+0

基本上你需要重置循環開始處的輸出變量,否則它們仍然包含上一次循環(迭代)的值。 – hakre

回答

0

OK,我認爲這個問題是=操作員覆蓋以前的任何值。

您有兩種選擇:首先是使用數組並使用$somevar[] .= somevalue語法,以便將每個值添加到數組中,而不是覆蓋以前的值。

第二種方法是事先聲明所有變量,然後使用.=級聯運算符,以便新字符串被追加到前一個字符串的末尾。

以下是我可能會在您的情況做:

<?php 
var $defectGatheringReqs = array(); 
var $defectReadyForDev = array(); 
. . .  
foreach($xmlDefect as $assetDefect){ 
. . .    
    switch($defectStatus) 
    { 
     case "Gathering Requirements"): 
      $defectGatheringReqs[] = $defectId; 
      break; 
     case "Ready for Development"): 
      $defectReadyForDev[] = $defectId; 
      break; 
    . . . 
    } 
?> 
<table> 
    <tr> 
     <td> 
      Gathering Requirements 
     </td> 
     <td> 
      Ready for Development 
. . . 
    </tr> 
    <tr> 
     <td> 
      <?php foreach($defectGatheringReqs as $id) { ?> 
       <div class='bugsItem'> 
        <?php echo $id; ?> 
       </div> 
      <?php } ?> 
     </td> 
. . . 
+0

我會給這個嘗試以及。好像我記得已經嘗試過你的第二個選項。 – RyanPitts

0

我真的很感激所有幫助。我最終找到了一個完全不同的解決方案來解決我的問題我現在正在向服務器上的PHP文件發出一個jQuery AJAX調用請求,該請求調用另一個服務器上的API(必須這樣做,因爲AJAX調用自己不能跨越不同的域), XML返回。

然後,我只是使用JavaScript/jQuery解析XML並將其附加到正確的列。 jQuery使附加部分更容易! :)

注意:不能標記這個答案顯然是選擇的答案2天,但會在那之後做。