Autor Zpráva
maks
Profil
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
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
Mozna OT, ale myslim, ze se to k tomuto hodi - Traverzovani kolem stromu
maks
Profil
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
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
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
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
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 

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: