2017-04-02 1 views
1

Salut J'ai un tableau PHP comme celui-ciPHP crosstab mise en forme de tableau

$table=array(); 
$subject_names=array(); 

$subject_names[118]="English"; 
$subject_names[108]="Software Engeneering"; 

$table['Josh'][118]['int'] =55; 
$table['Josh'][118]['ext'] = 10; 
$table['Josh'][108]['int'] =45; 
$table['Josh'][108]['ext'] = 12; 

$table['Matt'][118]['int'] =45; 
$table['Matt'][118]['ext'] = 12; 
$table['Matt'][108]['int'] =50; 
$table['Matt'][108]['ext'] = 15; 

Ici 118 et 108 sont id_sujet Je suis en train de le formater comme celui-ci

student |  English   | Software Engeneering | 
      | int. mark | ext. mark | int. mark | ext. mark | 
    ___________________________________________________________ 
    Josh | 55  | 10   | 45  | 12 
    Matt | 45  | 12   | 50  | 15 

J'ai essayé

echo "Student Name\t"; 

foreach($subject_names as $sub_name) 
{ 
    echo "$sub_name\t"; 
} 
echo "<br>";  

foreach($table as $sname => $subjects){ 

    echo "$sname\t"; 

    foreach($subjects as $subject_name => $types) 
    { 
     foreach($types as $marks) 
     { 
      echo "$marks\t"; 
     } 
    } 
    echo "<br>"; 

} 

Cela fonctionne très bien mais si je change la position de l'élément tableau de la table comme

$table['Josh'][118]['int'] =55; 
$table['Josh'][108]['int'] =45; 
$table['Josh'][118]['ext'] = 10; 
$table['Josh'][108]['ext'] = 12; 

Cela ne donnera pas un résultat correct. Est-il de toute façon pour assurer que le résultat est toujours correct.

Merci pour toute votre aide et suggestions

+0

Je vais supposer que vous ** ne codifiez pas ces valeurs par défaut, mais que vous les extrayez d'une base de données? Le problème que vous avez ici est que votre code s'attend à ce que tout soit dans un ordre parfait. Si vous attendez des choses en panne, vous devrez d'abord les trier. Si c'est un cas que vous attendez, je vous donnerai volontiers plus d'aide si vous en avez besoin. – Augwa

+0

Oui, exactement, je tire ces valeurs de la base de données. J'apprécierai grandement votre aide. – sanu

+0

Ok, donc vous devez juste vous assurer que vous triez correctement les valeurs de votre base de données ... c'est-à-dire 'ORDER BY student, class_id, mark_type' – Augwa

Répondre

0

Voici une solution que j'ai écrit pour votre demande, choisir les scores en utilisant le $subject_names que le contrôle plutôt que les étudiants de la feuille de match (j'espère que vous obtenez ce que je veux dire après avoir traversé les codes) ...

$table=array(); 
$subject_names=array(); 

// notice that I switched subject order, just to show that subjects control the marks displayed thereby ensuring consistent score mapping 
$subject_names[108]="Software Engeneering"; 
$subject_names[118]="English"; 

// and I'm using the rearranged scores (the sample use-case you specified in the question that distorts your output) 
$table['Josh'][118]['int'] =55; 
$table['Josh'][108]['int'] =45; 
$table['Josh'][118]['ext'] = 10; 
$table['Josh'][108]['ext'] = 12; 

$table['Matt'][118]['int'] =45; 
$table['Matt'][118]['ext'] = 12; 
$table['Matt'][108]['int'] =50; 
$table['Matt'][108]['ext'] = 15; 

echo "Student Name\t"; 

foreach($subject_names as $sub_name) 
{ 
    echo "$sub_name\t"; 
} 
echo "\n"; 

// proposed solution: 
foreach($table as $sname => $subjects){ 

    echo "$sname\t"; 

    foreach ($subject_names as $subject_id => $name) { 

     foreach ($subjects[$subject_id] as $mark) { 
      echo "$mark\t"; 
     } 
    } 
    echo "\n"; 

} 

est ici la sortie du script ci-dessus ...

Student Name Software Engeneering English 
Josh 45 12 55 10 
Matt 50 15 45 12 

les mêmes données en cours par le script prévu dans la question, voici la sortie (déformée) ...

Student Name Software Engeneering English 
Josh 55 10 45 12 
Matt 45 12 50 15 

P.S: 'Engeneering' devrait être 'ingénierie'

J'espère avoir été utile. À la votre!

+0

Corriger l'ordre de ses données ne l'aide pas. Le problème est quand les données sont hors service. – Augwa

+0

S'il vous plaît lire les codes ... J'ai réarrangé les données pour montrer que mon algorithme n'est pas affecté par l'ordre des données, n'a pas * correct * –

+0

pas agréable de downvote ce que vous ne comprenez pas @Augwa –