Autor Zpráva
libis
Profil
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
rekurze
Joker
Profil
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
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
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
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
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
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
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
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
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
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
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
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
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
SwimX:
K tomu příkladu, ještě by bylo dobré si držet už použité prvky a skončit, pokud na nějaký z nich narazím znovu. Jinak se to může zacyklit.
SwimX
Profil
Joker:
první části věty rozumím, druhé už ne :) jak by se to mohlo zacyklit?
Joker
Profil
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
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á :-)

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: