Autor Zpráva
srigi
Profil
Hello, pomocou ORM z databazy vytiahnem stromovy zoznam kategorii v takejto forme => odkaz Vsimnite si pls, ze kazda polozka ma kluc level. Potreboval by som poradit s algoritmom, ktory by taketo pole preiteroval a vyplul mi pole zoradene do stromu.
THX.
tiso
Profil
srigi: Ako chceš aby ten výsledok presne vyzeral?
Nox
Profil
Podle mě tam jde hlavně o to lft a rgt... podobný způsob má Jakub Vrána na webu, ale spíš z hlediska MySQL

Přijde mi že je to dokonce už celkem seřazené, mno, každopádně...

u tohoto platí že pro uzel s level1, lft1 a rgt1 mají všichni potomci lft menší jak lft1 a rgt menší jak rgt1....přímé potomky potom získáš touto podmínkou AND level=level1+1

na konci podstromu pak lft+1=rgt myslim

....no chtěl jsem nějaký algoritmus vymyslet, ale už musim končit

...nejspíš to půjde taky najít....
srigi
Profil
tiso:
takto, s tym ze "Root" (level 0) sa vo vysledku nebude vyskytovat (preskoci sa).
srigi
Profil
Alebo by aj teoreticky stacilo "zahlbit" polozku do pola pomocou nejakebo
$output = array();
...
foreach ($nodes as $node) {
  $temp = '';

  for ($i = 0; $i < $node['level']; $i++) {
    $temp .= '[]';  // podla hodnoty $node['level'] sa vytvori prislusny pocet - [], [][], [][][]
  }

  // nejaka magia spoji $output a $temp - $output[], $output[][], $output[][][] a priradi $node
}


Ale neviem ci toto neporusi hierarchiu (myslim, ze ano a je to nanic sposob).
srigi
Profil
OK, netreba dalej riesit! Nakoniec som tu strukturu nepotreboval a postaci mi ploche pole.
tiso
Profil
//$in - vstupne pole
unset($in[0]);//odstranime root
$out=cats_to_tree($in);

function cats_to_tree($tree, $lft=0, $rgt=1000, $level=1){
	$out=array();
	foreach($tree as $key => $val){
		if($val['lft'] > $lft and $val['rgt'] < $rgt and $val['level'] == $level){//len nody ktore nas zaujimaju
			$out[$val['name']]=$val;
			if($val['lft'] != $val['rgt']-1){//mame deti, pridaj ich
				$out[$val['name']]['children']=cats_to_tree($tree, $val['lft'], $val['rgt'], $level+1);
			}
		}
	}
	return $out;
}


edit: nemám rád nevyriešené veci, možno sa to niekomu hodí...
srigi
Profil
tiso:
Tak ta potesim, budem to potrebovat. Inac diky, funguje to vyborne.

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: