| předchozí | obsah DP | home | následující |

2.5.11. Referenční příručka funkcí

Funkce jsou řazeny abecedně. U všech je uveden stručný popis jejich činnosti a vstupní a výstupní hodnoty a kompletní zdrojový kód funkcí s komentáři. Kód lze také nalézt přímo v souboru funkce.php. Nápovědy k základním funkcím PHP zde neopisuju, lze je najít v dokumentaci PHP na [14].
define()
definice konstant - substituce dlouhých nebo často používaných řetězců za jiný. Hodí se pro zjednodušení zápisu. V PHP se definují proměnné pomocí funkce define():
define(string "KONST", 'dlouhatansky obsah konstanty KONST');

"BR" = tag <br /> a zalomení řádku
"NL" = zalomení řádku
"HTM_ZAH" = celá hlavička XHTML dokumentu až po open tag </body>
"HTM_ZAP" = záhlaví XHTML dokumentu: </body></html>
"HTM_VALID" = odkaz a obrázek na validační stránky W3C pro kontrolu správnosti dokumentu XHTML1 http://validator.w3.org/
/*--------------------------------------------------------*/
/* definice konstant                                      */
/*--------------------------------------------------------*/

define("BR", "<br />\n");

define("NL", "\n");

define("HTM_ZAH", '
<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <meta http-equiv="Content-type" content="text/html; charset=windows-1250" />
<link rel="stylesheet" href="test.css" type="text/css" /> 
<title>programový systém TEST</title>
</head>
<body>' );

define("HTM_ZAP", '</body></html>');

define("HTM_VALID",'<hr /><p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" />
</a> </p>');


formular()
vygeneruje počet $zad_ot otázek z MOJEPOLE $arr_in do formuláře testu, výstup na obrazovku. vypsaná formulářová data se odesílají do zpracujícího skriptu $nextscript = v mém použití 3.php.

void formular(array $arr_in, int $zad_ot, string $nextscript)
/*--------------------------------------------------------*/
/* formular()                                             */
/* generuje $zad_ot otazek do formulare testu             */
/*--------------------------------------------------------*/

function formular($arr_in, $zad_ot, $nextscript)        
 {
  print '<h2 class="test">Test na téma:</h2>'.NL;
  print '<h1 class="test">'.$arr_ins[0][0].'</h1>'.NL.NL;

  print "počet otázek testu: ".$zad_ot.BR;

  print'<form action="'.$nextscript.'" method="post">'.BR;

  for($i=1;$i<=$zad_ot;$i++)    /* pres otazky */
    {
      print '<font class="test_ota">'.$i.'. '.$arr_in[$i][0][0].'</font>';   /* pisu zadani */
      print '<table class="test">'.NL;

      for($j=1;$j<=$arr_in[$i][0][1];$j++)   /* pres odpovedi */
        {

       print '<tr><td class="test_odp">'.NL.'<input type="hidden" value="n" name="skrt'.'['.$i.']'.'['.$j.']'.'" />'.NL;
          print '<input type="checkbox" value="a" name="skrt'.'['.$i.']'.'['.$j.']'.'" />'.$arr_in[$i][$j][0].NL;
          print '</td></tr>'.NL.NL;           
        }  /* endfor $j */

      print '</table>'.BR.NL.NL;

    } /* endfor $i */

  print '<input type="submit" value="odeslat" />'.NL;
  print '<input type="reset" value="smazat" />'.NL;
  print '</form>'.NL;

 }


is_implicit_x()
otestuje zda má atribut $in povolenou hodnotu 'a' nebo 'n', případně nastaví implicitní a vrátí

string is_implicit_a(string $in); string is_implicit_n(string $in);
/*--------------------------------------------------------*/
/* is_implicit_x()                                        */
/* otestuje zda ma atribut $in povolenou hodnotu          */
/* 'a' nebo 'n' a pripadne nastavi implicitni             */
/*--------------------------------------------------------*/

function is_implicit_n($in) {if ($in!="a") $in="n"; return($in);}
function is_implicit_a($in) {if ($in!="n") $in="a"; return($in);}


legenda_hodn()
vrátí řetězec textu HTML s legendou pro uložení podle typu hodnoceni $typ a kontroluje jestli $typ je 1,2 nebo 3. při nerovnosti nastaví typ 1

function legenda_hodn($typ)
/*--------------------------------------------------------*/
/* legenda_hodn()                                         */
/* zobrazeni legendy podle typu hodnoceni                 */
/*--------------------------------------------------------*/

function legenda_hodn($typ)
{
/* ---------------- typ 2 --------------------------------*/
if ($typ==2)            
{
$save=NL.'<hr /><br /><b> ZPŮSOB HODNOCENÍ TESTU </b> 
<br /><b>typ2 - hledání správných odpovědí - kontrola správnosti jen u zaškrtnutých variant</b>
<br /> zaškrtnutá odpověď je dobře - zeleně a plus body 
<br /> zaškrtnutá odpověď je špatně - červeně a minus body
<br /> nezaškrtnuté - nehodnoceno, šedě, bez bodů
<br /> tučným písmem jsou správné varianty odpovědí'.NL.BR.BR.'
<table class="test">
<tr><td><img src="a.gif" alt="a" /></td><td class="test_aa">Správná varianta odpovědi, je zaškrtnuta - dobře  </td><td class="test_bod"> +2 </td></tr>
<tr><td><img src="a.gif" alt="a" /></td><td class="test_an">Nesprávná varianta odpovědi, je zaškrtnuta - špatně </td><td class="test_bod"> -2 </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_ga">Správná varianta odpovědi, měla být zaškrtnuta  </td><td class="test_bod">  </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_gn">Nesprávná varianta odpovědi, neměla být zaškrtnuta</td><td class="test_bod">  </td></tr>

</table><br />
';}
/* ---------------- typ 3 --------------------------------*/
elseif ($typ==3)          
{
$save=NL.'<hr /><br /><b> ZPŮSOB HODNOCENÍ TESTU </b> 
<br /><b>typ3 - autoškola - body jen za kompletně správně zodpovězenou otázku</b>
<br /> odpověď je dobře - zeleně  
<br /> odpověď je špatně - červeně
<br /> tučným písmem jsou správné varianty odpovědí'.NL.BR.BR.'
<table class="test">
<tr><td><img src="a.gif" alt="a" /></td><td class="test_aa">Správná varianta odpovědi, je zaškrtnuta - dobře  </td><td class="test_bod">  </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_na">Správná varianta odpovědi, měla být zaškrtnuta - špatně  </td><td class="test_bod">  </td></tr>
<tr><td><img src="a.gif" alt="a" /></td><td class="test_an">Nesprávná varianta odpovědi, je zaškrtnuta - špatně </td><td class="test_bod">  </td></tr>
<tr><td> </td><td> </td><td class="test_bod"> 0 </td></tr>
</table><br />

<table class="test">
<tr><td><img src="a.gif" alt="a" /></td><td class="test_aa">Správná varianta odpovědi, je zaškrtnuta - dobře  </td><td class="test_bod">  </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_nn">Nesprávná varianta odpovědi, neměla být zaškrtnuta - dobře</td><td class="test_bod">  </td></tr>
<tr><td> </td><td> </td><td class="test_bod"> 2 </td></tr>
</table><br />
';}

/* -------- standartne  typ 1 ------------------------------*/
else          
{
$typ = '1';
$save=NL.'<hr /><br /><b> ZPŮSOB HODNOCENÍ TESTU </b> 
<br /><b>typ1 - kontrola správnosti všech variant</b>
<br /> odpověď je dobře - zeleně a plus body 
<br /> odpověď je špatně - červeně a minus body
<br /> tučným písmem jsou správné varianty odpovědí'.NL.BR.BR.'
<table class="test">
<tr><td><img src="a.gif" alt="a" /></td><td class="test_aa">Správná varianta odpovědi, je zaškrtnuta - dobře  </td><td class="test_bod"> +2 </td></tr>
<tr><td><img src="a.gif" alt="a" /></td><td class="test_an">Nesprávná varianta odpovědi, je zaškrtnuta - špatně </td><td class="test_bod"> -2 </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_na">Správná varianta odpovědi, měla být zaškrtnuta - špatně  </td><td class="test_bod"> -2 </td></tr>
<tr><td><img src="n.gif" alt="n" /></td><td class="test_nn">Nesprávná varianta odpovědi, neměla být zaškrtnuta - dobře</td><td class="test_bod"> +2 </td></tr>
</table><br />
';}

return array($typ, $save);
} 


michej_pole()
vrátí promíchané pole $arr_in od indexu [1] do konce, [0] zůstane.

array michej_pole(array $arr_in)
/*--------------------------------------------------------*/
/* michej_pole()                                          */
/* promicha pole od indexu [1] do konce, [0] zustane      */
/*--------------------------------------------------------*/

function michej_pole($arr_in) 
{ 
 $arr_out = Array();
 $arr_out[0] = $arr_in[0];

 $prvku = $arr_in[0][1];

 srand ((double) microtime() * 10000000);

 $keys = range(1,$prvku);  /* generuje pole klicu od 1 do poctu prvku */
 shuffle ($keys);          /* zamicha polem klicu */

for($i=1; $i<=$prvku; $i++)
 {
  $arr_out[$i]=$arr_in[$keys[$i-1]];
 }

return ($arr_out);
}

michej_test()
promíchá v MOJEPOLE $arr_in odpovědi a otázky testu dle parametrů z konfigurace $mich_ot, $mich_od a vrátí zpět

array michej_test(array $arr_in, string $mich_ot, string $mich_od)
/*--------------------------------------------------------*/
/* michej_test()                                          */
/* promicha v mojepole odpovedi a otazky testu dle cfg    */
/*--------------------------------------------------------*/

function michej_test($arr_in, $mich_ot, $mich_od) 
{ 
 $arr_out = Array();
 $arr_out[0] = $arr_in[0];  
 $arr_pom = Array();

if ($mich_ot=="a"):  $arr_pom = michej_pole($arr_in);         /* micham otazky */ 
           else:  $arr_pom = $arr_in;
endif;

if ($mich_od=="a"):                                      /* micham odpovedi */ 
             { for($i=1; $i<=$arr_in[0][1]; $i++)       /* pres otazky */
                 {
                  $arr_out[$i] = michej_pole($arr_pom[$i]);  /* micha odpovedi*/
                }
             }
              else:  $arr_out=$arr_pom;
endif;

return ($arr_out);
}

nactifile()
načte obsah souboru $jmeno do proudu

string nactifile(string $jmeno)
/*--------------------------------------------------------*/
/* nactifile()                                            */
/* nacte obsah souboru do proudu                          */
/*--------------------------------------------------------*/

function nactifile($jmeno) 
{ 
 $fp = fopen($jmeno,'r');
 $data = fread($fp, filesize($jmeno));
 fclose($fp);
 return ($data); 
}

parse2arr()
z proudu xml souboru $proud získaného nactifile() přeparseruje data a vrátí strukturované pole se všemi informacemi

array parse2arr(string $proud)
/*--------------------------------------------------------*/
/* parse2arr()                                            */
/* z datoveho proudu xml souboru preparseruje a udela pole*/
/*--------------------------------------------------------*/

function parse2arr($proud)  
{
$parser = xml_parser_create();                      /* parser v php */
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); /* preskakuje bile znaky*/
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0); /* maly velky pismena*/
      
xml_parse_into_struct($parser,$proud,$vals,$index);
xml_parser_free($parser);

return ($vals);
}

prepis_cfg()
zjednoduší a přepíše veliké pole s konfigurací získané z parse2arr() a vrátí pole s mnou danou strukturou zjednodušených dat

array prepis_cfg(array $arr_in);
/*--------------------------------------------------------*/
/* prepis_cfg()                                           */
/* zjednodusi a prepise velike pole z parseru do mejepole */
/*                                                        */
/* intval() - ze string retezce udela cislo integer       */
/*--------------------------------------------------------*/

function prepis_cfg($arr_in)      
{                    
 for($i=0;$i<=sizeof($arr_in);$i++)
        {
          switch ($arr_in[$i][tag]):     /* porovnavani tagu xml */
             case "zadani":{
                    $arr_out[z_ad]=$arr_in[$i][attributes][adresa];
                    $arr_out[z_ot]=intval($arr_in[$i][attributes][otazek]);
                    $arr_out[z_ca]=intval($arr_in[$i][attributes][cas]);
                    $arr_out[z_lo]=is_implicit_n($arr_in[$i][attributes][login]);
                  } break;
             case "michani":{
                    $arr_out[m_ot]=is_implicit_n($arr_in[$i][attributes][otazek]);
                    $arr_out[m_od]=is_implicit_n($arr_in[$i][attributes][odpovedi]);
                  }      break;
             case "vysledky":{
                    $arr_out[v_po]=intval($arr_in[$i][attributes][pocitani]);
                    $arr_out[v_zo]=is_implicit_a($arr_in[$i][attributes][zobrazovat]);
                    $arr_out[v_uk]=is_implicit_n($arr_in[$i][attributes][ukladat]);
                    $arr_out[v_ad]=$arr_in[$i][attributes][adresar];
                  }  break;

           endswitch;
         } //endfor

 return($arr_out);
}

prepis_test()
zjednoduší a přepíše veliké pole s testem získané z parse2arr() a vrátí MOJEPOLE s mnou danou strukturou zjednodušených dat

array prepis_test( array $arr_in)
/*--------------------------------------------------------*/
/* prepis_test()                                          */
/* zjednodusi a prepise velike pole z parseru do mejepole */
/*--------------------------------------------------------*/

function prepis_test($arr_in) 
{
 $ot=1; $odp=1;
 for($i=0;$i<=sizeof($arr_in);$i++)
        {
          switch ($arr_in[$i][tag]):
             case "okruh": $arr_out[0][0]=$arr_in[$i][value];
             break;
             case "otazka":{
                            switch($arr_in[$i][type]):
                              case "open": $odp=1;
                              break;
                              case "close": $ot++;
                              break;
                            endswitch;
                          }
             break;
             case "zadani": { if ($arr_in[$i][attributes][typ]=="url"): 
                         $arr_out[$ot][0][0]='<a href="'.$arr_in[$i][value].'" target="new" class="test_url">'.$arr_in[$i][value].'</a>';
                           else:  $arr_out[$ot][0][0]=$arr_in[$i][value];
                     endif;
                   }
             break;
             case "odpoved":{ if ($arr_in[$i][attributes][typ]=="url"): 
                         $arr_out[$ot][$odp][0]='<a href="'.$arr_in[$i][value].'" target="new" class="test_url">'.$arr_in[$i][value].'</a>';
                           else:  $arr_out[$ot][$odp][0]=$arr_in[$i][value];
                     endif;
                   }
                             $arr_out[$ot][$odp][1]=$arr_in[$i][attributes][spravnost];
                             $arr_out[$ot][$odp][2]=intval($arr_in[$i][attributes][body]);
                             $arr_out[$ot][0][1]=$odp;
                             $odp++;
          
             break;
           endswitch;
         } //endfor
          $arr_out[0][1]=$ot-1;

return ($arr_out);
}

vyhodnot_test()
Vyhodnocuje test, generuje data pro zobrazeni na obrazovku a uložení do souborů. Porovná MOJEPOLE $arr_test s předanými zaškrtnutými checkbox v $arr_skrt, za podmínek nastavených v konfiguraci $cfg. Vrátí pole s řetězci textu v HTML pro pozdější uložení do souboru.

array vyhodnot_test(array $arr_test, array $arr_skrt, array $cfg)
/*--------------------------------------------------------*/
/* vyhodnot_test()                                        */
/* vyhodnocuje test, generuje data pro zobrazeni a ulozeni*/
/* vstup Array() - mojepole testu                         */
/*           - pole hodnot zaskrtnutych checkbox      */
/*           - cfg s parametry                        */
/* promene $saveX - kousky vystupu pro slepeni            */
/*--------------------------------------------------------*/

function vyhodnot_test($arr_test, $arr_skrt, $cfg)        

{
  $bodu = 0;       /* dosazeny pocet bodu */
  $bodu_m = 0;     /* maximalni mozny pocet bodu */

  $save0 ='<h2 class="test">Výsledky testu na téma:</h2>'.NL;
  $save0.='<h1 class="test">'.$arr_test[0][0].'</h1>'.BR;

  for($i=1;$i<=$cfg[z_ot];$i++):     /* pres otazky */
    {
     $save1.='<font class="test_ota">'.$i.'. '.$arr_test[$i][0][0].'</font>'.NL;   /* pisu zadani */
     $save1.='<table class="test">'.NL;
     $spatn=0;
     $bodu_p=0;

     for($j=1;$j<=$arr_test[$i][0][1];$j++):  /* pres odpovedi */
     { //1

     $skrt=$arr_skrt[$i][$j];     /*pomocne promenne pro prehlednejsi zapis podminek*/
     $t0=$arr_test[$i][$j][0];
     $t1=$arr_test[$i][$j][1];
     $t2=$arr_test[$i][$j][2];

     if ($skrt=="a"): $save1.='<tr><td><img src="a.gif" alt="a" /></td>';
     else:            $save1.='<tr><td><img src="n.gif" alt="n" /></td>';
     endif;


        /* vyber typu hodnoceni - (1) standartne */

     if ($cfg[v_po]==2)  /* typ (2) */
            {if ($t1=="a") $bodu_m += $t2;
             if (($skrt=="a") && ($t1=="a")){ $bodu += $t2; $save1.='<td class="test_aa"> '.$t0.'</td><td class="test_bod"> +'.$t2.' </td></tr>'.NL; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="a")){             ; $save1.='<td class="test_ga"> '.$t0.'</td><td class="test_bod">          </td></tr>'.NL;}
          if (($skrt=="a") && ($t1=="n")){ $bodu -= $t2; $save1.='<td class="test_an"> '.$t0.'</td><td class="test_bod"> -'.$t2.' </td></tr>'.NL; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="n")){             ; $save1.='<td class="test_gn"> '.$t0.'</td><td class="test_bod">          </td></tr>'.NL;}
            }
     elseif ($cfg[v_po]==3)  /* typ (3) */
            {if (($skrt=="a") && ($t1=="a")){ $bodu_p += $t2; $save1.='<td class="test_aa"> '.$t0.'</td><td class="test_bod"> </td></tr>'.NL; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="a")){ $bodu_p += $t2; $save1.='<td class="test_na"> '.$t0.'</td><td class="test_bod"> </td></tr>'.NL; $spatn=$spatn+1;}
          if (($skrt=="a") && ($t1=="n")){ $bodu_p += $t2; $save1.='<td class="test_an"> '.$t0.'</td><td class="test_bod"> </td></tr>'.NL; $spatn=$spatn+1; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="n")){ $bodu_p += $t2; $save1.='<td class="test_nn"> '.$t0.'</td><td class="test_bod"> </td></tr>'.NL;}
          if ($j==$arr_test[$i][0][1])
                
               {if($spatn==0):$bodu_m+=round($bodu_p/$j); $save1.='<tr><td></td><td></td><td class="test_bod"> '.round($bodu_p/$j).' </td></tr>'.NL; $bodu+=round($bodu_p/$j);
                         else:$bodu_m+=round($bodu_p/$j); $save1.='<tr><td></td><td></td><td class="test_bod"> 0 </td></tr>'.NL;
                endif;}
            }
     else      /* typ (1) */
            {
          $bodu_m += $t2;
            if (($skrt=="a") && ($t1=="a")){ $bodu += $t2; $save1.='<td class="test_aa"> '.$t0.'</td><td class="test_bod"> +'.$t2.' </td></tr>'.NL; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="a")){ $bodu -= $t2; $save1.='<td class="test_na"> '.$t0.'</td><td class="test_bod"> -'.$t2.' </td></tr>'.NL;}
          if (($skrt=="a") && ($t1=="n")){ $bodu -= $t2; $save1.='<td class="test_an"> '.$t0.'</td><td class="test_bod"> -'.$t2.' </td></tr>'.NL; $ot_odp = 1;}
          if (($skrt=="n") && ($t1=="n")){ $bodu += $t2; $save1.='<td class="test_nn"> '.$t0.'</td><td class="test_bod"> +'.$t2.' </td></tr>'.NL;}
            }

     }        
     endfor;   /* endfor j */

    $save1.='</table>'.BR;
    $ot_odp_c += $ot_odp;  /* odpovidanych otazek */
    $ot_odp =0;
   }  
  endfor;  /* endfor i */

  $procent=round(($bodu/$bodu_m)*100,0); /* pocitani uspesnosti, zaokrouhleno na cele */
  $save2='<b> Bodové hodnocení:</b> Získali jste (<b>'.$bodu.'</b>) bodů ze <b>'.$bodu_m.'</b> možných. Úspěšnost je ('.$procent.')%.';
  $save2.=BR.BR;

  $save3= "\t".$bodu.' / '.$bodu_m."\t"."\t".$ot_odp_c.' / '.$cfg[z_ot].' / '.$arr_test[0][1];
  $save4= $bodu.'/'.$bodu_m;
  $save5= $procent.' %';

return array($save0,$save1,$save2,$save3,$save4,$save5);

}

| předchozí | obsah DP | home | následující |