stepan Posted October 26, 2008 Report Share Posted October 26, 2008 (edited) Palidziet ludzu tikt gala ar rekursijas algoritmu. Ideja ir sekojosha: ir datubaze un tabula, kura ir viens laukums next_id - ieksha var but vai nu integer skaitlis (id) vai nu intervals formata sakuma_skaitlis - beigu skaitlis (id). Tatad veidojas koks ar zaroshanu. Tai zaroshanai ir jabut definetai IF THEN nosacijumos. Mana pieeja: izveidoju globalo masivu data un katru vilni rakstu jauna masiva elementa'. Vilnis = masivs. Ja notiek sashkelshanas nemu pirmo elementu un turpinu aktivo vilni, bet parejiem kopeju aktiva vilna asti jaunaja masiva data elementa un izsaucu ar rekursijas palidzibu savu funkciju velreiz tikai ar jauniem datiem. Ir problema ka vilni kaut ka sabruk un rakstas viena un ta pasha elementa... [2] => Array ( [0] => IF Vai ir nepieciešama maiņa ? == Jā [1] => THEN Vai pietiek naudas resursu ? IF Vai pietiek naudas resursu ? == Jā [2] => THEN Kādam ir jābūt autobusa dzinējam ? IF Kādam ir jābūt autobusa dzinējam ? == Benzīna dzinējs [3] => THEN Kāds ir nepieciešams autobusu tips ? IF Kāds ir nepieciešams autobusu tips ? == Turistiskais [4] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? IF Kāda režīmā ir jāstrādā ātrumu kastei ? == Automātiskā [5] => RESULT = Šī sistēma nevar Jums palīdzēt [6] => THEN Kādam ir jābūt autobusa dzinējam ? IF Kādam ir jābūt autobusa dzinējam ? == Dizeļdzinējs [7] => THEN Kāds ir nepieciešams autobusu tips ? IF Kāds ir nepieciešams autobusu tips ? == Turistiskais [8] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? IF Kāda režīmā ir jāstrādā ātrumu kastei ? == Automātiskā [9] => RESULT = Šī sistēma nevar Jums palīdzēt [10] => THEN Kāds ir nepieciešams autobusu tips ? IF Kāds ir nepieciešams autobusu tips ? == Mikro [11] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? IF Kāda režīmā ir jāstrādā ātrumu kastei ? == Automātiskā [12] => RESULT = Šī sistēma nevar Jums palīdzēt ) error_reporting(E_ALL); function show_construct($pgid, $arrid){ global $data; $q = mysql_fetch_array(mysql_query("SELECT `condition`, `title`, `next_id` FROM zinashanu_baze WHERE id = ".$pgid." LIMIT 1")); if($q['next_id'] != 0){ if(!isset($data[$arrid])) $data[$arrid] = Array(); if($pgid && $pgid != 1) $data[$arrid][] = '<u>THEN '.$q['title'].'</u><br/><b>IF '.$q['title'].' == '.$q['condition'].'</b>'; elseif($pgid) $data[$arrid][] = '<b>IF '.$q['title'].' == '.$q['condition'].'</b> '; if(strpos($q['next_id'], '-')===false) show_construct($q['next_id'], $arrid); else{ $ids=explode('-', $q['next_id']); show_construct($ids[0], $arrid); for($i=((abs((int)$ids[0])+1));$i<=abs((int)$ids[1]);$i++) { $data [($arrid+1)] = Array(); $data [($arrid+1)] = array_merge ($data [($arrid)], $data [($arrid+1)]); show_construct($i, $arrid+1); } } } else $data[$arrid][] = '<i><b>RESULT = '.$q['title'].'</b></i>'; } global $data; $data=Array(); show_construct(0, 0); echo '<pre>'; print_r($data); Datu baze izskatas sekojoshi Tekoshais rezultats var but apskatits te http://78.154.135.181/lis/ Edited October 26, 2008 by stepan Link to comment Share on other sites More sharing options...
marrtins Posted October 26, 2008 Report Share Posted October 26, 2008 Varbūt sāc ar to, ka pārstrukturizē datus, ja dikti vēlies datus glabāt relāciju db. Ievies papildus tabulu, kur ir next_id pret id un tad ar rekursīviem pieprasījumiem vērsies pie db un daboun jau gatavu struktūru. P.S. Offtopikk, liekas manīju iekš Firebird rekursīvos kverijus, derētu tākā papētīt. Ir kādam pieredze? Link to comment Share on other sites More sharing options...
Gints Plivna Posted October 26, 2008 Report Share Posted October 26, 2008 Ja godīgi nemēģināju iedziļināties visā tai kodā, bet ir 2 piezīmes: 1) šeir ir raksts par rekursīvu datu glabāšanu un vaicājumiem MySQLā http://dev.mysql.com/tech-resources/articl...hical-data.html 2) atceries, ka tabulu savienojumi (join) var būt ne tikai ar ekvivaleneces nosacījumu, bet arī jebkādu citu, tai skaitā intervālu, kas iespējams šeit varētu noderēt. Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
bubu Posted October 26, 2008 Report Share Posted October 26, 2008 Es savukārt nesapratu kādā formātā tev vajag outputu no tās visas rekursijas. Link to comment Share on other sites More sharing options...
stepan Posted October 26, 2008 Author Report Share Posted October 26, 2008 Formatam ir jabut - masivs [0] => Array(pirmais IF THEN IF THEN vilnis) [1] => Array(otrais IF THEN IF THEN vilnis) [2] => Array(treshais IF THEN IF THEN vilnis) ... Runajot par intervaliem - skaidrs ka var izdarit ta JOIN .. ON (a>5 AND a<10), bet ir problema, ka tur intervals var but gan integer gan varchar, tatad vieglak apstradat ar PHP iespejam. Problema ir masivu veidoshana'. Ir aizdomas ka kaut kas ar indeksiem $arrid vai globalo masivu... Link to comment Share on other sites More sharing options...
bubu Posted October 26, 2008 Report Share Posted October 26, 2008 Kāpēc intervāls var būt varchar? Norādi intervālu kā divus INT laukus a un b. Tad attiecīgi salīdzini x>=a and x<=b. Link to comment Share on other sites More sharing options...
Recommended Posts