2009-06-25 11 views
0

J'ai 3 tables. Apls, Hulls et AplsHulls.Boucle à travers un tableau multidimensionnel pour afficher la grille en PHP

Apls se compose d'id, nom, date Hulls se compose d'id, production_name AplsHulls est une table de jointure et se compose d'id, apl_id, hull_id, statut.

Toutes les coques ne sont pas associées à chaque Apl. Ceux qui sont sont dans la table de jointure avec un statut (expédiés, en production, etc.)

Je dois afficher un rapport dans une table/grille qui contient les en-têtes de colonne suivants: Apl Name, Apl_Date puis la coque noms de production en tant que titres de colonne restants. (Si la coque 7 n'est pas dans le jeu de résultats, elle n'obtient même pas de colonne

Pour les données dont j'ai besoin pour lister le nom APL, APL date, puis boucle sur les colonnes restantes et remplir le statut Si les attributs apl et hull ne sont pas associés dans la table de jointure, remplissez simplement la cellule avec "NA"

J'ai essayé ceci de différentes manières et je peux actuellement obtenir la liste dynamique des en-têtes de colonnes pour les coques, je ne semblent jamais être en mesure d'obtenir les données à boucle à travers correctement

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 

J'ai besoin de la table pour montrer comme ceci:.

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

Notez les en-têtes de colonne ignorer ProdB depuis que le dossier était pas du tout dans la table de jointure. En outre, il remplit NA pour les colonnes qui sont dans la table de jointure, mais il peut ne pas avoir une association à dans la table de jointure.

C'est très déroutant, je sais.

+0

un exemple de code pourrait aider et peut-être échantillonner les données de vos tables – jcuenod

+0

Veuillez fournir plus d'informations sur vos données.Est-ce dans un tableau comme votre titre suggère ou dans les tableaux de DB comme la question elle-même suggère? Un exemple de tableau au lieu d'une description verbeuse aiderait aussi. – defines

+0

données Exemple: Apls Tableau Id: 1, Nom: X1-0000, Date: 1/1/2009 Id: 2, Nom: BG-5480, Date: 22/02/2009 Id: 3, nom: HG-0000, date: 27/02/2009 Hulls Tableau Id: 1, Production_name: proda Id: 2, Production_name: ProdB Id: 3, Production_name: ProdC Id: 4, Production_name: ProdD AplsHulls Tableau Id: 1, Apl_id: 1, Hull_id: 1, Statut: livré ID: 2, Apl_id: 1, Hull_id: 3, Statut:ordonnéesId: 3, Apl_id: 2, Hull_id: 4, Status: Livré – SonnyBurnette

Répondre

0

En supposant que vous avez tiré les données de la table dans un ensemble de tableaux:

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

Vous pouvez obtenir la liste des coques que vous aimez avec une requête comme ceci:

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

Vous peut (et devrait probablement) arrêter de lire cette réponse maintenant et juste utiliser cela obtenir les colonnes que vous aimez et ensuite comprendre comment mettre les données que vous avez dans le tableau. Mais une fois que vous avez cette liste de coques qui vous intéressent, vous pouvez demander à votre programme d'écrire un mauvais sql pour construire le résultat pour vous. Le code ci-dessous suppose que votre bibliothèque DB renvoie un tableau de lignes pour votre requête 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"; 
} 

Remplacez les appels à interroger par vos méthodes de requête de base de données.

Le résultat est 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); 

Il y a probablement une meilleure façon de construire la requête, mais cela devrait fonctionner. Il se décompose probablement si le nombre de coques est très important. Ou si l'une des tables impliquées est très grande. Si vos noms de produits ne sont pas légaux dans le SQL, vous devrez les mapper à autre chose.