Autor Zpráva
BedyR
Profil
Ahoj,
skript je funkční ale zdá se mi že je zbytečně dlouhý. Nejsem tak úplně v PHP zběhlí takže budu rád za každou radu.

cíl skriptu je :
- načíst data,
- převést řetězec do pole víceúrovňového ( jednou jsem na internetu vyděl příklad, když jsem hledal něco jiného a teď to nemohu najít, bylo to zpracované jedním příkazem, já to řeším cyklem )
- porovnat s dalším polem a vytvořit výsledné pole( tak aby obsahovalo klíče vyskytující se v obou polích a přebralo hodnotu 'typ_role' z pole generovaného z řetězce (hodnoty přiděleny uživateli) i v druhém poli je hodnota 'typ_role' (ale implicitní)
výsledek bude sloužit pro generování menu

tady je kód:
<?php
/*  verze s MySQL *//*
  $sql = "select sez_prav from . . . ." ;
  $res = mysql_query($sql) or die(mysql_error());
  if (mysql_num_rows($res)==1) {
    mysql_data_seek($res,0);
    $str = mysql_fetch_assoc($res);
    $pom =  explode('#', $str['sez_prav'], -1);
    $a   = count($pom);
    for ($x=0;$x<$a;$x++){ list($klic,$hodn) = explode("/", $pom[$x]); $prava[$klic] = $hodn; }
    $sql = "select menu . . . from . . . . . " ;
    $res = mysql_query($sql) or die(mysql_error());
    if (mysql_num_rows($res)>0) {
      mysql_data_seek($res,0);
      $menu = array();
      while ($rows = mysql_fetch_assoc($res)) {
         $kod = $rows['kod'];
         $menu[$kod]['typ_role'] = $rows['typ_role'];
         $menu[$kod]['nazev']    = $rows['nazev'];
      }
      $result = array_intersect_key($menu, $prava );
      while (list($klic, $prac) = each($result)) { $result[$klic]['typ_role'] = $prava[$klic]; }
    }
  }
*/
/*  verze s array     */
  $str = Array( "sez_prav" => "11/3#32/2#41/1#");
  $pom =  explode('#', $str['sez_prav'], -1);
  $a   = count($pom);
  $poc  = 6;
  $arr1 = array("kod" => "11","typ_role" => "2","nazev" =>"menu1");
  $arr2 = array("kod" => "21","typ_role" => "2","nazev" =>"menu2");
  $arr3 = array("kod" => "31","typ_role" => "2","nazev" =>"menu31");
  $arr4 = array("kod" => "32","typ_role" => "2","nazev" =>"menu32");
  $arr5 = array("kod" => "41","typ_role" => "2","nazev" =>"menu4");
  $arr6 = array("kod" => "51","typ_role" => "2","nazev" =>"menu5");

  for ($x=0;$x<$a;$x++){
    list($klic,$hodn) = explode("/", $pom[$x]);
    $prava[$klic]     = $hodn;
  }
  echo 'práva : <pre style="color:blue; font-size:10px; font-family:arial;">' ; print_r($prava);  echo '</pre>';
  for ($x=0;$x<$poc;$x++){
    $arr = ${"arr".($x+1)};
    $kod = $arr['kod'];
    $menu[$kod]['typ_role'] = $arr['typ_role'];
    $menu[$kod]['nazev']    = $arr['nazev'];
  }
  echo 'menu : <pre style="color:green; font-size:10px; font-family:arial;">' ; print_r($menu);  echo '</pre>';
  $result = array_intersect_key($menu, $prava );
  while (list($klic, $prac) = each($result)) {
    $result[$klic]['typ_role'] = $prava[$klic];
  }

  echo 'výsledek : <pre style="color:red; font-size:10px; font-family:arial;">' ; print_r($result);  echo '</pre>';
?>
1Pupik1989
Profil
Pokud to chápu, tak nastuduj LEFT JOIN.
BedyR
Profil
1Pupik1989:
Díky za námět, ale formát dat v tabulce 1 je stejný jako je na řádku 27 a v tabulce 2 jako na řádku 31.
Takže je pro porovnání data v první tabulce nejdříve pole 'sez_prav' = "11/3# ..." převést na stejný formát jako je v tabulce 2
'kod' = "11", 'typ_role'= "3" a to já viděl jako nejschůdnější přes pole.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: