2009-06-25 105 views
0

我有3個表格。 Apls,船體和AplsHulls。通過多維數組循環顯示網格中的PHP

Apls由ID,名稱,日期組成 外殼由id,production_name組成 AplsHulls是一個連接表,由id,apl_id,hull_id,status組成。

並不是每個船體都與每個Apl相關聯。那些在狀態的連接表中(已發貨,正在生產等)

我需要在包含以下列標題的表/網格中顯示報表:Apl Name,Apl_Date then the hull生產名稱作爲剩餘的列標題。 (如果外殼7不在結果集中,它甚至不會得到一列。

對於我需要列出apl名稱apl date的數據,然後遍歷其餘列並填寫狀態如果apl和船體沒有關聯在連接表中,那麼只需用「NA」填充單元格。

我已經嘗試了這一堆不同的方法,目前我可以獲得列標題爲船體的動態列表,我似乎從來沒有能夠越過正確地獲取數據,以循環

Sample Data: 

Apls Table 

Id: 1, Name: X1-0000, Date: 1/1/2009 
Id: 2, Name: BG-5480, Date: 2/22/2009 
Id: 3, Name: HG-0000, Date: 2/27/2009 

Hulls Table 

Id: 1, Production_name: ProdA 
Id: 2, Production_name: ProdB 
Id: 3, Production_name: ProdC 
Id: 4, Production_name: ProdD 

AplsHulls Table 

Id: 1, Apl_id: 1, Hull_id: 1, Status:Delivered 
Id: 2, Apl_id: 1, Hull_id: 3, Status:Ordered 
Id: 3, Apl_id: 2, Hull_id: 4, Status:Delivered 

我需要的表顯示是這樣的:

APL |  Date  | ProdA | ProdC | ProdD 
X1-0000 | 01/01/2009 | Delivered | Ordered | NA 
BG-5480 | 02/22/2009 |  NA  |  NA | Delivered 

注意列標題​​忽略ProdB,因爲該記錄根本不在連接表中。此外,它填充連接表中的列的NA,但它可能沒有關聯到連接表中。

我知道這很混亂。

+0

一些示例代碼將有所幫助,或許可以從您的表中抽取數據 – jcuenod 2009-06-25 13:39:24

回答

0

假定您已經拉表中的數據轉換爲一組數組:

<?php 
    $aplToHullMap = array(); 

    foreach($AplsHulls as $row) 
    { 
     $aplID = $row[ 'apl_id' ]; 
     $hullID = $row[ 'hull_id' ]; 
     $status = $row[ 'status' ]; 

     if(isset($aplToHullMap[ $aplID ])) 
      $aplToHullMap[ $aplID ][ $hullID ] = $status; 
     else 
      $aplToHullMap[ $aplID ] = array($hullID => $status); 
    } 
?> 
<table> 
    <tr> 
    <th>Apl Name</th> 
    <th>Apl Date</th> 
<?php 
    foreach($Hulls as $row) 
     echo("<th>" . $row[ 'production_name' ] . "</th>\r\n"); 
?> 
    </tr> 
<?php 
    foreach($Apls as $row) 
    { 
?> 
    <tr> 
    <td><?php echo($row[ 'name' ]); ?></td> 
    <td><?php echo($row[ 'date' ]); ?></td> 
    <?php 
     $map = $aplToHullMap[ $row[ 'id' ] ]; 

     foreach($Hulls as $hull) 
     { 
      if(isset($map[ $hull[ 'id' ] ])) 
       $status = $map[ $hull[ 'id' ] ]; 
      else 
       $status = 'NA'; 

      echo("<td>" . $status . "</td>\r\n"); 
     } 
    ?> 
    </tr> 
<?php 
    } 
?> 
</table> 
1

你可以得到你所關心的與這樣的查詢船體的名單:

select h.id, pname from hulls h join aplshulls on (h.id=hull_id) 

你可以(也可能應該)停止閱讀這個答案,只需使用獲取你關心的列,然後弄清楚如何把你的數據放到表中。

但是,一旦你有你關心的船體列表,你可以讓你的程序寫一些邪惡的SQL來爲你建立結果。下面的代碼假設你的DB庫爲你的SQL查詢返回一個行數組。

$hulls = query("select h.id, pname from hulls h join aplshulls on (h.id=hull_id)"); 
/* This should give a result like: 
* $hulls = array(array('id'=>1,'pname'=>'proda'), 
*    array('id'=>3,'pname'=>'prodc'), 
*    array('id'=>4,'pname'=>'prodd')); 
*/ 

$sql = "select name, mdate"; 
foreach ($hulls as $row) { 
    $sql .= ", ifnull({$row['pname']},'NA') {$row['pname']}"; 
} 
$sql .= " from apls "; 

foreach ($hulls as $row) { 
    $sql .= " left join (select apl_id, status as {$row['pname']} from hulls h \join aplshulls ah on (h.id=hull_id) where pname='{$row['pname']}') as {$row['pn\ame']} on ({$row['pname']}.apl_id=apls.id)"; 
} 
$sql .= " where apls.id in (select distinct apl_id from aplshulls)"; 

$result = query($sql); 
foreach ($result as $row) { 
    print "<tr>"; 
    foreach ($row as $value) { 
    print "<td>$value</td>"; 
    } 
    print "</tr>\n"; 
} 

將調用替換爲使用數據庫查詢方法進行查詢。

產生的SQL是:

select name, date, 
     ifnull(proda,'NA') proda, ifnull(prodc,'NA') prodc, ifnull(prodd,'NA') prodd 
from apls 
    left join (select apl_id, status as proda 
       from hulls h join aplshulls ah on (h.id=hull_id) 
       where pname='proda') as proda on (proda.apl_id=apls.id) 
    left join (select apl_id, status as prodc 
       from hulls h join aplshulls ah on (h.id=hull_id) 
       where pname='prodc') as prodc on (prodc.apl_id=apls.id) 
    left join (select apl_id, status as prodd 
       from hulls h join aplshulls ah on (h.id=hull_id) 
       where pname='prodd') as prodd on (prodd.apl_id=apls.id) 
where 
    apls.id in (select distinct apl_id from aplshulls); 

有可能是一個更好的方式來構建查詢但這應該工作。如果船體數量非常大,它可能會崩潰。或者如果任何涉及的表格非常大。 如果您的產品名稱在sql中不合法,您需要將它們映射到其他位置。