Заполните матрицу эффективным способом - PullRequest
0 голосов
/ 14 марта 2011

Я новичок в 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.

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

использование массива очень поможет вам автоматизировать весь процесс, вот способ решить проблему, может быть (почти наверняка) он не самый лучший, но я мог бы быть идеей.

//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
....

, но я предлагаю вам относиться к другим языкам так же, как к основным, я думаю, что хорошо иметь "нормализованный"структура данных

1 голос
/ 15 марта 2011

Во-первых, вы должны взглянуть на оператор "switch ()".

Во-вторых, последнее "если" всегда будет равно true, потому что ||запускает совершенно новое выражение, и непустая строка всегда равняется true, поэтому ||«7» должно быть ||$ sl ['StudentLanguage'] ['language_id'] == '7'

В-третьих, если вы структурировали свой массив по-другому, вам вообще не понадобится if.если вы использовали идентификатор студента в качестве ключа массива, вы можете просто напечатать нужные данные.пример: echo $ student_language [1] ['listening];

В-четвертых, этот тип данных, вероятно, требует своего собственного класса вместо многомерных массивов.

Fifth вместовесь текст, который вы хотите напечатать в переменную, вы можете просто выйти из 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...