2011-03-14 110 views
0

我是新来的PHP和一般网页开发(第一大项目)。我主要解决了这个问题,但我认为他们的方式我做到了效率不高(不聪明),但仍然没有妥善解决,这就是为什么我想知道您的意见。以高效的方式填充矩阵

我有语言(student_language)的阵列。在每种语言中,我们都有一个名字的字符串和4个整数(用这种语言的技能的标点符号)。 我将这些信息转换为PDF格式,并创建了一个HTML表格来呈现那里的语言。 所以,我必须用我的数组填充它。在这里,我有我的问题:

  • 首先,我想我使用了很多变量:你看到一种方式有更少的?
  • 第二,如您在下面的代码中看到的,“Andere(Others)”类别中有多种语言。所以,如果此类别中有多种语言,我想添加另一行。任何提示?

代码:提前

foreach ($student_language as $sl){ 

//Dutch 
if ($sl['StudentLanguage']['language_id'] == '5'){ 
    $ned_listening=$sl['StudentLanguage']['listening']; 
    $ned_spoken=$sl['StudentLanguage']['speaking']; 
    $ned_reading=$sl['StudentLanguage']['reading']; 
    $ned_written=$sl['StudentLanguage']['written']; 
} 
//French 
    if ($sl['StudentLanguage']['language_id'] == '2'){ 
    $fre_listening=$sl['StudentLanguage']['listening']; 
    $fre_spoken=$sl['StudentLanguage']['speaking']; 
    $fre_reading=$sl['StudentLanguage']['reading']; 
    $fre_written=$sl['StudentLanguage']['written']; 
} 
//English 
    if ($sl['StudentLanguage']['language_id'] == '1'){ 
    $eng_listening=$sl['StudentLanguage']['listening']; 
    $eng_spoken=$sl['StudentLanguage']['speaking']; 
    $eng_reading=$sl['StudentLanguage']['reading']; 
    $eng_written=$sl['StudentLanguage']['written']; 
} 
    //Flemish 
    if ($sl['StudentLanguage']['language_id'] == '5'){ 
    $fle_listening=$sl['StudentLanguage']['listening']; 
    $fle_spoken=$sl['StudentLanguage']['speaking']; 
    $fle_reading=$sl['StudentLanguage']['reading']; 
    $fle_written=$sl['StudentLanguage']['written']; 
} 
    //Others : German, Polish, Greek, Portuguese, Russian, Italian , Spanish 
    if ($sl['StudentLanguage']['language_id'] == '6' || '7' || '8' || '9' || '10' || '11' || '12'){ 
    $oth_listening=$sl['StudentLanguage']['listening']; 
    $oth_spoken=$sl['StudentLanguage']['speaking']; 
    $oth_reading=$sl['StudentLanguage']['reading']; 
    $oth_written=$sl['StudentLanguage']['written']; 
    } 
} 


$talenkennis= <<<EOD 
<br /> 
<br /> 
<br /> 
<table border="1" align="center"> 
    <tr> 
     <th></th> 
     <th>Begrijpen</th> 
     <th>Spreken</th> 
     <th>Lezen</th> 
     <th>Schrijven</th> 
    </tr> 
    <tr> 
     <td>Nederlands</td> 
     <td>$ned_listening</td> 
     <td>$ned_spoken</td> 
     <td>$ned_reading</td> 
     <td>$ned_written</td> 
    </tr> 
    <tr> 
     <td>Frans</td> 
     <td>$fre_listening</td> 
     <td>$fre_spoken</td> 
     <td>$fre_reading</td> 
     <td>$fre_written</td> 
    </tr> 
    <tr> 
     <td>Engels</td> 
     <td>$eng_listening</td> 
     <td>$eng_spoken</td> 
     <td>$eng_reading</td> 
     <td>$eng_written</td> 
    </tr> 
    <tr> 
     <td>Duits</td> 
     <td>$fle_listening</td> 
     <td>$fle_spoken</td> 
     <td>$fle_reading</td> 
     <td>$fle_written</td> 
    </tr> 
    <tr> 
     <td>Andere</td> 
     <td>$oth_listening</td> 
     <td>$oth_spoken</td> 
     <td>$oth_reading</td> 
     <td>$oth_written</td> 
    </tr> 
    <tr> 
     (Noties = 1 , Voldoende = 2 , Grondig = 3 , Moedertaal = 4) <br /> 
    </tr> 

</table> 
EOD; 
$pdf->writeHTML($talenkennis, true, false, false, false, ''); 

谢谢!

Alf。

+0

从哪里开始... – dqhendricks 2011-03-14 20:58:06

回答

2

使用数组西港岛线帮助您很多使自动化的全过程,这里是解决proble,可能(几乎是肯定的),它是不是最好的,但我可能是一个想法的方式。

//array with all languages (not andere's ones) 
$langs = array(1=>"eng",2=>"fre",...); 
//result array 
$result = array(); 
//rsult array for others languages 
$result['other'] = array(); 

foreach ($student_language as $sl) 
{ 
    //let's use a variable fot that index 
    $index = $langs[$sl['StudentLanguage']['language_id']]; 

    //copy all info on relative language array element 
    $result[$index]['listening'] = $sl['StudentLanguage']['listening']; 
    $result[$index]['spoken'] = $sl['StudentLanguage']['speaking']; 
    $result[$index]['reading'] = $sl['StudentLanguage']['reading']; 
    $result[$index]['written'] = $sl['StudentLanguage']['written']; 

    //if other language 
    if(in_array($index,array(6,7,8,9,10,11,12))) 
    { 
     //create language array 
     $other = array(); 
     //store language data 
     $other['listening'] = $sl['StudentLanguage']['listening']; 
     $other['spoken'] = $sl['StudentLanguage']['spoken']; 
     $other['reading'] = $sl['StudentLanguage']['reading']; 
     $other['written'] = $sl['StudentLanguage']['written']; 
     //add language to other's array 
     array_push($result['other'],$other); 
    } 
} 

这样你就会有一个这样的结构:

-english 
--listening 
--spoken 
--reading 
--written 
-french 
--listening 
--spoken 
--reading 
--written 
... 
-others 
--0 
---listening 
---spoken 
---reading 
---written 
.... 

,但我会建议你去对待别人的语言,就像主要的,我认为这是好事,有一个“标准化“数据结构

+0

它看起来太棒了!我会检查并评论它,谢谢你! – alfizqu 2011-03-15 11:59:52

1

首先,您应该查看“switch()”语句。

其次,最后一个“如果”永远等同于真实的,因为||开始一个全新的表达式,并且非空字符串总是等于真,所以|| '7'应该是|| $ SL [ 'StudentLanguage'] [ 'LANGUAGE_ID'] == '7'

第三,如果你的结构数组不同,你不需要在IFS的。如果您将学生ID用作数组键,则可以简单地打印所需的数据。例如:echo $ student_language [1] ['listening'];

第四,这种类型的数据可能要求自己的类,而不是多维数组。

第五,而不是把所有要打印到变量的文字,你可以简单地打破了PHP的一个“?>”,并把你想要的HTML。

?> 
<br /> 
<br /> 
<br /> 
<table border="1" align="center"> 
    <tr> 
     <th></th> 
     <th>Begrijpen</th> 
     <th>Spreken</th> 
     <th>Lezen</th> 
     <th>Schrijven</th> 
    </tr> 
    <tr> 
     <td>Nederlands</td> 
     <td><?php= $ned_listening ?></td> 
+0

我明白了,这就是我一直在寻找!比你更好! – alfizqu 2011-03-15 12:00:25