2015-03-19 24 views
1

我嵌套了foreach循環顯示嵌套數組中的MySQL記錄。從MySQL查詢嵌套數組 - 邏輯顯示在foreach循環中的記錄

while ($row = mysql_fetch_array($result)) { 
    $departments[$row['department_name']][$row['group_name']][] = $row['lab_test'] . ',' . $row['result'] . ',' . $row['um'] . ',' . $row['reference_interval']; 
} 

    foreach($departments as $department_name => $groups){ 
    echo "<tr class='department'><td>" . $department_name . "</td></tr>"; 
     foreach($groups as $group_name => $tests){ 
       echo "<tr class='test_group'><td>" . $group_name . "</td></tr>"; 
        foreach($tests as $test){ 
          list($test_name, $test_result, $test_um, $test_interval) = explode(',', $test); 

echo "<tr class='test_item'><td>" . $test_name . "</td><td>" . $test_result . "</td><td>" . $test_um . "</td><td>" . $test_interval . "</td></tr>"; 
        } 
    } 
    echo "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"; 
} 

該工程確定,但我想改變它,以便$group_name只顯示,如果它不等於$test_name。直到下一個foreach循環纔會啓動問題$test_name

回答

1

我沒有想到複製foreach循環以獲得邏輯中較早的$test_name值。這工作,但它似乎有點雜亂,但它的作品...

foreach($departments as $department_name => $groups){ 
    echo "<tr class='department'><td>" . $department_name . "</td></tr>"; 
     foreach($groups as $group_name => $tests){ 
      foreach($tests as $test){ 
          list($test_name, $test_result, $test_um, $test_interval) = explode(',', $test); 
      } 
      if($group_name != $test_name){ 
       echo "<tr class='test_group'><td>" . $group_name . "</td></tr>"; 
      } 
        foreach($tests as $test){ 
          list($test_name, $test_result, $test_um, $test_interval) = explode(',', $test); 
1

首先,仔細看看你的代碼結構。 3嵌套foreach循環通常不是很好的做法。

我建議重新寫這個來利用PHP中的stdClass

一個重寫將完成你相當快找什麼:

while ($row = mysql_fetch_array($result)) { 
    $resultObj = new stdClass(); 
    $resultObj->department_name = $row['department_name']; 
    $resultObj->group_name = $row['group_name']; 
    $resultObj->lab_test = $row['lab_test']; 
    ...etc 
    $results[] = $resultObj; 
} 

foreach($results as $result) { 
    if ($resultObj->group_name != ($resultObj->lab_test . "," . $resultObj->result . "," . $resultObj->um . "," . $resultObj->reference_interval)) { 
    // the group_name is not equal to the concatenated string above 
    // so here is where you would echo your table row 
} 

我也想看看,你有表格式。爲了增強可讀性,你要對包含group_namedepartment

+0

感謝您...看起來更清潔和可管理...我會給它一個去。 – IlludiumPu36 2015-03-19 02:46:13

+0

我看不到如何讓測試顯示在其關聯的測試組名稱下......這就是爲什麼我使用嵌套的foreach循環。 – IlludiumPu36 2015-03-19 02:50:04

+0

我明白爲什麼,但有一個更乾淨的方式來做你想做的事情。你可以做的最重要的事情之一是,如果你有一個測試名稱列表作爲單獨的數據,那麼把這些測試名稱放到一個不同的數組中,而不是把它們放在'$ departments'數組中。所以你應該有'$ departments'和'$ test_group_names' – 2015-03-19 02:52:27

0

我建議這個代碼第三的foreach之前使用tr的使用colspan

if($group_name != $tests[$group_name][0]) 
    echo "<tr class='test_group'><td>" . $group_name . "</td></tr>";