‘Programování’

Dub 07

Kamarádka potřebovala do školy naprogramovat jednoduché menu. Když už jsem se s tím dělal, dávám to k dispozici široké veřejnosti, třeba se to někomu bude někdy hodit :) .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  menu();
  system("PAUSE");	
  return 0;
}
 
int menu()
{
    system("cls"); 
 
    printf("%sn","Vyber:");
    printf("%sn","1. FUNKCE1");
    printf("%sn","2. FUNKCE2");
    printf("%sn","3. Konec");
 
 
    int i = 0;
    printf("%s ","Zadej číslo volby: ");
    scanf("%d",&i);
    while(i < 1 || i > 3)
    {
           printf("%s ","Zadej znovu číslo volby: ");
           scanf("%d",&i);
    }
 
    switch(i)
    {
     case 1: funkce1(); break;         
     case 2: funkce2(); break;
     case 3: 
          system("cls");
          printf("%sn","Sbohem"); 
          break;  
    }
}
 
int funkce1()
{
   system("cls");
   printf("%sn","Volas funkci 1:");  
   int i;
   printf("%s ","Napis 1 nebo 0 a zmackni enter: ");
   scanf("%d",&i); 
 
   menu();  
}
 
 
int funkce2()
{
   system("cls");
   printf("%sn","Volas funkci 2:");  
   int i;
   printf("%s ","Napis cislo a zmackni enter: ");
   scanf("%d",&i); 
 
   menu();  
}
Tagy:
Dub 07

Před pár měsící jsem zkoušel odhalit jak nejlépe vypsat dvouúrovňové menu přes databázi (mysql) a php. Dnes se s vámi o svůj postup podělím.

Na vzhledu databázové tabulky příliš nezáleží, v zásadě by měla obsahovat:

  • identifikátor řádku (id)
  • název položky menu
  • odkaz položky menu
  • typ položky menu
  • rodič položky

Tučně zvýrazněné položky jsou důležité, ty ostatní pouze rozšiřují funkcionalitu.

První postup je čistě programátorský – líný a prasácký :) – je to jednoduché a přímé řešení problému, ovšem velkou nevýhodou jsou nároky na paměť, databázi i samotný webserver – v momeňtě kd si generujeme menu a ukládáme ho například do cache je to naprosto ideální řešení, pokud se v menu často dělají změny popřípadě se při jeho vypisování nějak ovlivňuje jeho zobrazení, je nutné použít dynamický přístup k problému. První menu se hodí třeba v e-shopech, druhé je vhodnější pro weby s více vrstvami oprávnění pro uživatele a podobně. Zdrojový kód by měl být dobře pochopitelný pro každého proto jsem se s komentáři příliš nepytloval :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
error_reporting(E_ALL);
 
function getRuntime()
{
  list($a,$b) = explode(' ', microtime()); 
  return $a + (float)$b;
}
  //db
  $dbhost = 'localhost';
  $dbuser = 'root';
  $dbpass = ''; 
  $dbname = 'myweb';
$total = 0;
for($i=0;$i<1000;$i++)
{
 
$t1 = getRuntime();
 
$fdb1 = mysql_connect($dbhost,$dbuser,$dbpass);
$fdb2 = mysql_select_db($dbname);
mysql_query('SET NAMES utf8');
 
echo '<ul>';
$res = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = 0 ORDER BY parent ASC, nazev ASC");
while($a = mysql_fetch_row($res))
{
  echo '<li><a href="'.$a[2].'">'.$a[1].'</a></li>';
  if($a[3]==3 || $a[3]==4)
  {
    $res2 = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = '".$a[0]."' ORDER BY parent ASC, nazev ASC ");
    echo '<ul>';
    while($b=mysql_fetch_row($res2))
    {
      echo '<li><a href="'.$b[2].'">'.$b[1].'</a></li>';
    }
    echo '</ul>';
  }
}
echo '</ul>';
 
$t2 = getRuntime();
$t = ($t2-$t1);
//echo ' cycle runtime: '.$t.' sec';
$total += $t;
mysql_close($fdb1);
 
}
echo '</div>';
echo ' total runtime: '.($total/$i).' sec';
 
?>

Druhé řešení poměrně dobře čerpá veškeré krásy objektového programování, i když jsem si vědom že by se zdroják dal ještě více rychlostně i paměťově optimalizovat.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
error_reporting(E_ALL);
 
function getRuntime()
{
  list($a,$b) = explode(' ', microtime()); 
  return $a + (float)$b;
}
  //db
  $dbhost = 'localhost';
  $dbuser = 'root';
  $dbpass = ''; 
  $dbname = 'myweb';
$total = 0;
for($i=0;$i<1000;$i++)
{
 
$t1 = getRuntime();
 
$fdb1 = mysql_connect($dbhost,$dbuser,$dbpass);
$fdb2 = mysql_select_db($dbname);
mysql_query('SET NAMES utf8');
 
echo '<ul>';
$res = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = 0 ORDER BY parent ASC, nazev ASC");
while($a = mysql_fetch_row($res))
{
  echo '<li><a href="'.$a[2].'">'.$a[1].'</a></li>';
  if($a[3]==3 || $a[3]==4)
  {
    $res2 = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = '".$a[0]."' ORDER BY parent ASC, nazev ASC ");
    echo '<ul>';
    while($b=mysql_fetch_row($res2))
    {
      echo '<li><a href="'.$b[2].'">'.$b[1].'</a></li>';
    }
    echo '</ul>';
  }
}
echo '</ul>';
 
$t2 = getRuntime();
$t = ($t2-$t1);
//echo ' cycle runtime: '.$t.' sec';
$total += $t;
mysql_close($fdb1);
 
}
echo '</div>';
echo ' total runtime: '.($total/$i).' sec';
 
?>

Třída menuTree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class menuTree
{
  private $parentMenuItem;
  private $menuArray = array();
  private $innerTree = false;
  public $parent = 0;
  public $type = 'menuTree';
 
 
  public function setParent($parent, $menuItem)
  {
    $this->parent = $parent;
    $this->parentMenuItem = $menuItem;
  }
 
  public function loadItem($menuItem)
  {
    $this->menuArray[] = $menuItem;
  }
 
  public function createItem($text,$href,$css,$title,$id)
  {
    $this->menuArray[] = new menuItem($text,$href,$css,$title,$id);
  }
/*  
  public function loadTree($menuTree)
  {
    $this->menuArray[] = $menuTree;
  }
*/  
  public function createTree($parent, $menuItem)
  {
    $newMenu = new menuTree();
    $newMenu->setParent($parent, $menuItem);
    $this->menuArray[] = $newMenu;
    $this->innerTree = true;
  }
 
  public function insertInTree($parent, $menuItem)
  {
    //echo 'parent: '.$this->parent.'<br />';
    if($parent==$this->parent) return $this->menuArray[] = $menuItem;
    //if(count($menuArray))
    foreach($this->menuArray as $menu)
    {
      if($menu->type=='menuTree') 
        if($menu->innerTree)
          if($menu->insertInTree($parent, $menuItem)) 
            return true;
    }
    return false;
  }
/*  
  public function createInTree($parent,$text,$href,$css,$title,$id)
  {
    $item = new menuItem($text,$href,$css,$title,$id);
    $this->insertInTree($parent,$item);
  }
*/  
  public function show()
  {    
    if($this->parent) $this->parentMenuItem->show();
    if(count($this->menuArray)>0)
    {
      echo '<ul>';
      foreach($this->menuArray as $menuItem) $menuItem->show();
      echo '</ul>';
    }
  }
 
}

Třída menuItem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class menuItem
{
  private $text;
  private $href;
  private $css;
  private $title;
  private $id;
  public $type = 'menuItem';
 
  public function __construct($text,$href,$css,$title,$id)
  {
    $this->text = $text;
    $this->href = $href;
    $this->css = $css;
    $this->title = $title;
    $this->id = $id;
    //echo ' item created;; ';
  }
 
  public function show()
  {
    echo '<li><a href="'.$this->href.'" class="'.$this->css.'" title="'.$this->title.'">'.$this->text.'</a></li>';
  }
}
Tagy: