Autor | Zpráva | ||
---|---|---|---|
libis Profil |
#1 · Zasláno: 25. 10. 2009, 11:52:21
Zdravím, mám problém se zapsáním cyklu.
Potřebuju vytvořit toto: http://s2.imgupload.cz/img/--/70336/T8HCy/script.png a to potřebuju, aby se úrovnovalo až do 9 úrovní. Možná se to zdá jako blbost, ale je to potřebný, já si tam pak hodím podmínky, takže by se to do té 9. úrovně vrstvilo jen málokdy. Napsal jsem si doma kód pomocí cyklu for a ten ho ručně 9x do něho napasoval, neexistuje to nějak lépe zapsat? Hlavně kratší aby to bylo... |
||
blaaablaaa Profil |
#2 · Zasláno: 25. 10. 2009, 11:55:21
|
||
Joker Profil |
#3 · Zasláno: 25. 10. 2009, 12:08:36 · Upravil/a: Joker
Když načrtnu myšlenku:
function cyklus($pocet, $uroven){ echo("<ol>"); for($i = 1; $i<= $pocet; $i++){ echo("<li>"); if($uroven > 1) cyklus($pocet, $uroven - 1); echo("</li>"); } echo("</ol>"); } cyklus(4,3); - vyrobí zhruba to na obrázku. edit- dodatek: $pocet = kolik položek se vypíše v každém cyklu, $uroven = kolik se vypíše úrovní edit2: změněno <ul> na <ol> |
||
joe Profil |
#4 · Zasláno: 25. 10. 2009, 12:41:37
Nemám rád rekurze a tak bych to řešil asi takhle.
Do nějakého pole bych si uložil strukturu, třeba $menu = array( '1' => array('1' => array('1', '2', '3', '4'), '2' => array('1', '2', '3', '4'), '3' => array('1', '2', '3', '4')) ); Možná to není zrovna ideální a asi to není přesně ten případ z obrázku, ale pro představu stačí. A pak to jednoduše projít jedním for cyklem (bude tam podmínka, jestli hodnota klíče je pole nebo není). Protože předpokládám, že čísla nejsou všechno co potřebuješ vypsat, a že za každým číslem bude následovat text, tak tu informaci stejně budeš muset někam uložit. |
||
Joker Profil |
#5 · Zasláno: 25. 10. 2009, 12:56:45
joe:
Tak pokud výstup nebude možné vypočítat, tak asi jiná cesta než nějaké pole není. Ale pokud by to byl případ jako na obrázku, Raději bych si napsal tu 9-řádkovou rekurzivní funkci a pak volal, než si vyrábět devítiúrovňové pole o 180 prvcích. |
||
AM_ Profil |
#6 · Zasláno: 25. 10. 2009, 13:29:29
joe:
„Nemám rád rekurze“ aneb nechce se mi chápat něco nového, tak to raději udělám mnohem složitěji tak, jak už to umím. To není úplně dobrý přístup pro programátora, rekurze jsou geniální řešení určitého typu problému a nějak to obcházet je hloupost; některé věci ani moc jinak udělat nejde. |
||
libis Profil |
#7 · Zasláno: 25. 10. 2009, 15:45:02
Díky za snahu, ale asi to není přesně to , co potřebuju, prostě mám jedno číslo a to má kolem sebe 4 čísla. Každé číslo z těch 4 čísel, má kolem sebe další 4 čísla a takhle jich je 9, a já potřebuju aby se nějak fakt zkráceně tohle dalo zapsat..
|
||
joe Profil |
#8 · Zasláno: 25. 10. 2009, 15:57:28
AM:
Rekurze pro mě nejsou nic nového, znám je. Nerad je píšu. Naopak mi pole přijde jednodušší, sice bude rekurze o dost kratší. A navíc, nejsem programátor, i když to tak trochu umím :-) Joker: Nejsem žádný expert, rád píšu věci tak, aby když se k nim pozdějc vrátim, abych jim rozuměl. A mezi ty věci rekurze nepatří :-) Vim, že moje řešení není super, ale jsem hrozně línej při psaní kódu přemýšlet.. libis: Na to co chceš, bych využil asi zas pole :-) kam bych si uložil kolik čísel bude celkem a kolik bude mít každé číslo potomků, nějak tak. A pak to projel zase nějakým for. Možná ti to trochu pomůže. |
||
Joker Profil |
#9 · Zasláno: 25. 10. 2009, 17:13:57
libis:
„asi to není přesně to , co potřebuju, prostě mám jedno číslo a to má kolem sebe 4 čísla. Každé číslo z těch 4 čísel, má kolem sebe další 4 čísla a takhle jich je 9“ Takhle se zhruba dá popsat to co jsem poslal. V čem to "není přesně ono"? joe: - „rád píšu věci tak, aby když se k nim pozdějc vrátim, abych jim rozuměl“ - „jsem hrozně línej při psaní kódu přemýšlet“ Tyhle dvě věci jsou skoro protiklady :-) |
||
AM_ Profil |
#10 · Zasláno: 25. 10. 2009, 20:34:07
joe:
tímhle stylem si možná jednoduché věci napíšeš a možná i budou fungovat, ale pokud to někdo myslí s programováním vážně, přemýšlet musí a používat efektivní metody jakbysmet (zajímavé - nevím jak v tomto případě, o tom jsem nepřemýšlel, ale zkus vymyslet třeba výpis adresářové struktury s rekurzí a bez ní. Bez rekurze se mi to ani vymyslet nepodařilo). Pokud máš s rekurzí opravdu osobní problém, nikdo tě nenutí ji používat, ale rozhodně bych na tvém místě to samé neradil ostatním. |
||
Mastodont Profil |
#11 · Zasláno: 25. 10. 2009, 21:39:14 · Upravil/a: Mastodont
zkus vymyslet třeba výpis adresářové struktury bez rekurze
Stačí příslušný iterátor ze SPL, ten už ji má v sobě :-) |
||
libis Profil |
#12 · Zasláno: 25. 10. 2009, 22:38:30
stále nevím, tak to trochu zdetailním. viz obrázek =>http://s2.imgupload.cz/img/--/70989/ZPRnb/dotaz.jpg
|
||
Trululum Profil * |
<?php for($i=1;$i<=9;$i++){ echo "<ul><li>".$i."</li>"; for($a=1;$a<=4;$a++){ echo "<ul><li>".$a."</li><ul>"; for($b=1;$b<=4;$b++){ echo "<li>".$b."</li>"; } echo "</ul></ul>"; } echo "</ul>"; } ?> Moderátor Alphard: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
|
||
libis Profil |
#14 · Zasláno: 26. 10. 2009, 09:18:40
hm tak tohle ne, to je jen vkladani for porad, to tam muzu vlozit 9x, mne jde o to zkraceni,a bych to tam nemusel dávat 9x
|
||
Joker Profil |
#15 · Zasláno: 26. 10. 2009, 09:36:30
libis:
Nemám tolik času se tím kódem detailně zabývat, ale vezme to vždycky políčko, něco zkontroluje, pak najde všechny sousední a pokračuje další iterací pro ty sousední? Pak ten "vnitřek" napsat do funkce a volat rekurzivně nebo v cyklu (nejsem si jistý, že rekurze bude nutná- nestačilo by prostě cyklem postupně projít políčka a kontrolovat jen jejich sousedy?), bude správné řešení. |
||
SwimX Profil |
#16 · Zasláno: 26. 10. 2009, 20:38:42 · Upravil/a: SwimX
pokud ti pomůže můj příklad z hodin informatiky.
Tabulka uživatelů (id) a jejich vedoucí (jejich id) uživ id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ------------------------------------------------------------------------------------------------ vedoucí id | 0 | 1 | 1 | 2 | 2 | 4 | 5 | 6 | 1 | 3 | znamená to, že uživtale s id 1 je hlavní vedoucí, uživatel 2 má vedoucího 1´, uživatel 3 taky, uživatel 4 má vedoucího 2 (a ten má vedoucího 1) atd atd. a rekurzivní funkce na zpracování pole a jeho výpis (až do neomezené úrovně) <?php $array = array('',0,1,1,2,2,4,5,6,1,3); /* první prvek pole je prázdný, protože se indexuje od 0 a já mám id uživatelů (klíče pole) od 1*/ hledej_bosse(1, $array); function hledej_bosse($boss, $array){ foreach($array as $uziv_id => $uziv_boss){ if ($uziv_boss == $boss){ echo "$boss - $uziv_id<br>"; hledej_bosse($uziv_id, $array); } } } ?> |
||
Joker Profil |
#17 · Zasláno: 26. 10. 2009, 20:58:20 · Upravil/a: Joker
SwimX:
|
||
SwimX Profil |
#18 · Zasláno: 26. 10. 2009, 21:04:03
Joker:
první části věty rozumím, druhé už ne :) jak by se to mohlo zacyklit? |
||
Joker Profil |
#19 · Zasláno: 26. 10. 2009, 21:06:53
SwimX:
Joaha, omlouvám se. Podíval jsem se na tu funkci ještě jednou a dělá opak toho, co jsem původně myslel- nehledá nadřízené daného uživatele, ale podřízené daného uživatele. |
||
SwimX Profil |
#20 · Zasláno: 26. 10. 2009, 21:11:30
Joker:
no, jmenuje se špatně to je fakt, ale hledej emlpoyee (nebo jak je zaměstnanec) tak by neznělo :) |
||
libis Profil |
díky, hodně mi pomohlo toto:
function cyklus($pocet, $uroven){ echo("<ol>"); for($i = 1; $i<= $pocet; $i++){ echo("<li>"); if($uroven > 1) cyklus($pocet, $uroven - 1); echo("</li>"); } echo("</ol>"); } cyklus(4,3); za což dík moc...podle všeho to funguje tak, jak má :-) |
||
Časová prodleva: 14 let
|
0