PHP ızgara göstermek için çok boyutlu bir dizi döngü

2 Cevap php

Ben 3 tablolar var. Apls, Hulls ve AplsHulls.

Apls consists of id, name, date Hulls consists of id, production_name AplsHulls is a join table and consists of id, apl_id, hull_id, status.

Her Gövde her APL ile ilişkilidir. Hangi olanlar (üretimde sevk, vb) bir statü ile katılmak tablosunda var

Api Adı, kalan sütun başlıkları olarak Apl_Date sonra gövde üretim isimleri: Ben şu sütunlar başlıkları olan bir tablo / ızgara bir raporu görüntülemek gerekir. Gövde 7 sonuç kümesinde değilse (, hatta bir sütun almaz.

Veri için ben APL adını, APL tarihini, ardından kalan sütunlar arasında döngü listelemek ve katılmak tablodaki kayıtlar için durum doldurmanız gerekmektedir. APL ve gövde katılmak tabloda ilişkili değilse, o zaman sadece "NA" ile hücreyi dolduracak.

Bu farklı şekillerde bir sürü denedim ve ben şu anda gövdeler için sütun başlıkları dinamik bir listesini alabilirsiniz, ben doğru genelinde döngü verileri elde etmek mümkün gibi görünüyor asla.

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

Bu gibi göstermek için tablo gerekir:

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

Bu kayıt tüm katılmak tabloda değildi çünkü sütun başlıkları ProdB görmezden dikkat edin. Ayrıca, birleştirme tabloda olan sütunlar için NA doldurur, ancak bu birleştirme tablosunda bir ilişki gerek olmayabilir.

Ben biliyorum, çok kafa karıştırıcı.

2 Cevap

Eğer böyle bir sorgu ile ilgili bakım gövdelerin listesini alabilirsiniz:

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

Siz (ve muhtemelen olmalı) şimdi bu cevabı okuma durdurmak ve sadece kullanmak size umurumda sütunları almak ve daha sonra tabloya sahip veri koymak nasıl anlamaya olabilir.

Ama sen seni önemsiyorum gövdelerin bu listeyi kez program sizin için sonucu oluşturmak için bazı kötü sql yazmak olabilir. Aşağıdaki kodu DB kütüphanesi sql sorgu için satır bir dizi döndürür varsayar.

$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";
}

Veritabanı sorgu yöntemleri ile sorgulamak için çağrı değiştirin.

Oluşan 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);

There is probably a better way to build the query but this should work. It probably breaks down if the number of hulls is very large. Or if any of the involved tables is very large. If your product names aren't legal in the sql you will need to map them to something else.

Eğer diziler kümesi içine tablo verilerini çekti ettik varsayarsak:

<?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>