2015-03-19 63 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>";