Autor | Zpráva | ||
---|---|---|---|
maks Profil |
#1 · Zasláno: 18. 7. 2009, 15:38:34
Ahoj,
ani jsem nevěděl, jak lépe toto téma nazvat, pokusím se tedy podrobně popsat, čeho se snažím dosáhnout, Mám v DB uloženu pozici ve strukturovaném seznamu, zvolil jsem pro typ seznamu ve tvaru x.x.x.x varchar. V PHP si v cyklu while přes mysql_fetch_assoc vypisuji obsah celé tabulky, výpis vypadá nějak následovně: while ($while = mysql_fetch_assoc($result)) { echo "<td>" . $while['pozice'] . "</td><td>" . $while['zbytek'] . "</td>"; } 1 ... 1.1 ... 1.2 ... 1.2.1 ... 1.2.1.2 ... 1.2.1.3 ... 1.2.2 ... atd. a potřeboval bych u položek, pod kterými je ještě nějaká ve stejné úrovni, připsat "další". Výpis by tedy vypadal následovně: 1 ... 1.1 ... další 1.2 ... 1.2.1 ... další 1.2.1.2 ... další 1.2.1.3 ... 1.2.2 ... atd. Nevím, jestli si musím tu poznámku "další" ukládat k těm položkám do DB, nebo jestli by to šlo řešit na straně PHP u výpisu. Moje myšlenka byla explodem tu pozici rozdělit podle mezery a NĚJAK porovnávat, jestli se pak dále vyskytuje prvek s pozicí na prvních místech stejnou a na posledním o jednu vyšším. Bojím se, že tohle nepůjde, proto se ptám: Jak by toto šlo řešit? Díky. |
||
Alphard Profil |
#2 · Zasláno: 18. 7. 2009, 21:48:59
maks:
„Nevím, jestli si musím tu poznámku "další" ukládat k těm položkám do DB, nebo jestli by to šlo řešit na straně PHP u výpisu.“ Není to nezbytné, ale docela by pomohlo ukládat alešpoň úroveň zanoření. Lze ji získat i přes count(explode(".", $uroven)). Tím váš příklad mohu upravit do podoby: 1 2 2 3 4 4 3 atd. Už asi vidíte, že se "další" přidá, pokud se hodnota aktuální úrovně opakuje ještě alespoň jednou. Pak stačí dodat, že výsledek z databáze musíte dočasně uložit do pole, abyste v něm mohl hledat. Zjednodušený přilad s polem: <?php $struktura = array( "1", "1.1", "1.2", "1.2.1", "1.2.1.2", "1.2.1.3", "1.2.2" ); foreach ($struktura as $line) $ciselne[] = count(explode(".", $line)); foreach ($struktura as $line) { $akt = array_shift($ciselne); echo "<li>".$line; if (in_array ($akt, $ciselne)) echo " dalsi"; echo "</li>\n"; } ?> Výstup: • 1 • 1.1 dalsi • 1.2 • 1.2.1 dalsi • 1.2.1.2 dalsi • 1.2.1.3 • 1.2.2 |
||
Lamicz Profil |
#3 · Zasláno: 19. 7. 2009, 05:27:10
Mozna OT, ale myslim, ze se to k tomuto hodi - Traverzovani kolem stromu
|
||
Časová prodleva: 4 dny
|
|||
maks Profil |
#4 · Zasláno: 23. 7. 2009, 14:16:33 · Upravil/a: maks
Alphard
„Pak stačí dodat, že výsledek z databáze musíte dočasně uložit do pole, abyste v něm mohl hledat.“ V DB tu úroveň uloženou mám, ale asi mám někde chybu, co se výpisu z DB a cyklu týče. Dosud to mám takhle: $sql = mysql_query ("SELECT pozice, uroven, (...) FROM tabulka ORDER BY pozice ASC LIMIT 10"); echo "<table>"; while ($array = mysql_fetch_assoc($sql)) { echo "<tr>"; echo "<td>" . $array[pozice] . "</td>"; echo "<td>" . $array[...] . "</td>"; echo "<td>" . $array[...] . "</td>"; echo "<td>Tady bych u některých potřeboval vepsat tu poznámku.</td>"; echo "</tr>"; } echo "</table>"; To pole, ktere jsi napsal, jsem zkoušel dát na začátek cyklu i mimo něj, ale nepodařilo se mi to, bohužel, rozchodit. while ($array = mysql_fetch_assoc($sql)) { $struktura = array($array['pozice']); ... } Mohl bych Tě/kohokoliv jiného, poprosit o další pomocnou ruku? Peru se s tím už skoro týden a nic. Myslím, že to ani nemusí být tak těžké, ale kde ostatní začínají, já, bohužel, končím. Děkuji. |
||
maks Profil |
#5 · Zasláno: 24. 7. 2009, 18:21:59
Ahoj,
moc se omlouvám, že toto vlákno vytahuji, ale rád bych poprosil Alpharda/kohokoliv jiného, jestli by mi pomohl začlenit Alphardův kód do mého. Nejtěžší na celé věci - samotný kód - Alphard již napsal, ale bohužel se mi nedaří jej užít. Moc děkuji za pomoc, potřeboval bych s tímto hnout. |
||
Alphard Profil |
#6 · Zasláno: 24. 7. 2009, 18:33:24 · Upravil/a: Alphard
maks:
„ale rád bych poprosil Alpharda/kohokoliv jiného, jestli by mi pomohl začlenit Alphardův kód do mého“ Alphard nemá v poslední době moc čas. Snad nějak takhle, doufám, že ve sloupci uroven je to, co si myslím. <?php $sql = mysql_query ("SELECT pozice, uroven FROM tabulka ORDER BY pozice ASC LIMIT 10"); while ($line = mysql_fetch_assoc ($sql)) $cislene[] = $line['uroven']; mysql_data_seek ($sql, 0); echo "<table>\n"; while ($line = mysql_fetch_assoc ($sql)) { $akt = array_shift($ciselne); echo "<tr>"; echo "<td>" . $line['pozice'] . "</td>"; if (in_array ($akt, $ciselne)) echo "<td>Dalsi</td>"; else echo "<td></td>"; echo "</tr>\n"; } echo "</table>\n"; ?> |
||
maks Profil |
#7 · Zasláno: 24. 7. 2009, 18:56:42
Alphard
„Alphard nemá v poslední době moc čas. “ o to více děkuji a vážím si toho, že jsi mi chvilku věnoval. „doufám, že ve sloupci uroven je to, co si myslím. “ ano, ve sloupci pozice je skutečně pozice zanoření. „Snad nějak takhle“ toto bohužel nevypisuje přesně, resp. vypisuje i tam, kde nemá být. Uvedu příklad: • 1 • 1.1 dalsi • 1.2 • 1.2.1 dalsi • 1.2.1.2 dalsi • 1.2.1.3 dalsi tady být nemá • 1.2.2 • 1.2.2.1 dalsi • 1.2.2.2 dalsi • 1.2.2.3 Díky |
||
maks Profil |
#8 · Zasláno: 24. 7. 2009, 20:05:17
Alphard
ještě jednou ti musím poděkovat, svým řešením jsi mě pořádně nakopl a já se konečně po drobné úpravě dobral kýženého řešení. Přidávám ukázku kódu, kdyby někdo hledal něco podobného. $sql = mysql_query ("SELECT pozice, uroven FROM tabulka ORDER BY pozice ASC LIMIT 10"); while ($line = mysql_fetch_assoc ($sql)) $ciselne[] = $line['uroven']; mysql_data_seek ($sql, 0); echo "<table>\n"; while ($line = mysql_fetch_assoc ($sql)) { $dalsi = next($ciselne); //pozice následujícího prvku $akt = array_shift($ciselne); echo "<tr>"; echo "<td>" . $line['pozice'] . "</td>"; if (in_array ($akt, $ciselne) and $line['uroven'] <= $dalsi['uroven']) echo "<td>Dalsi</td>"; else echo "<td></td>"; echo "</tr>\n"; } Vypíše • 1 • 1.1 dalsi • 1.2 • 1.2.1 dalsi • 1.2.1.2 dalsi • 1.2.1.3 //tady být nemá a není • 1.2.2 • 1.2.2.1 dalsi • 1.2.2.2 dalsi • 1.2.2.3 |
||
Časová prodleva: 15 let
|
0