Autor | Zpráva | ||
---|---|---|---|
Lucyk Profil |
#1 · Zasláno: 22. 10. 2017, 17:49:22
Ahoj,
prosím zkušenější o kontrolu následujícího cyklu, který by měl vypisovat po 4 výsledcích na řádku. echo "<table id='tabulka_vypis'>"; echo "<tr>"; $poradi = 0; while (list($rok,$vyrobce,$sada) = mysql_fetch_row($navrat)): echo "<td width=\"280\"><a href=\"index.php?rok=$rok&vyrobce=$vyrobce&sada=$sada\"></a></td>"; $poradi++; if($poradi == 4) { echo "</tr><tr>"; $poradi = 0; } endwhile; while($poradi != 4) { $poradi++; echo "<td width=\"280\"> </td>"; } echo "</tr>"; echo "</table>"; Částečně to funguje, jak bych si představovala. Pokud mám počet záznamů, který není dělitelný 4, tak to vypíše OK. ![]() Ale když je počet záznamů dělitelný 4, tak mi tam automaticky naskočí pod tabulku jeden volný řádek. ![]() Snažila jsem se dopátrat na internetu, zda je cyklus napsán správně, ale asi tam bude chyba v html syntaxi použití (nevhodně umístěno) <tr></tr> ?
Nebo opravdu bude chyba ve špatném vyhodnocování podmínky? Děkuji za upřesnění. |
||
Alphard Profil |
#2 · Zasláno: 22. 10. 2017, 20:07:42
Kombinace
</tr><tr> se vypisuje i za posledním záznamem, což přidává ten řádek. Buď ten kód trochu rozdělit podle např. Nejčastější potíže s PHP (FAQ) » Výpis výsledků z databáze (nebo z jiného zdroje) do tabulky o více sloupcích, nebo v tom vašem kódu kontrolovat, jestli se už nevypisuje poslední záznam.
|
||
Lucyk Profil |
#3 · Zasláno: 24. 10. 2017, 05:36:55
Alphard:
Děkuji za objasnění. V případě, že bych ve stávajícím kódu přidala vyhodnocování, zda se vypisuje poslední záznam, tak mě napadá nahrazení části kódu tímto: if ($poradi == 4) { echo "</tr><tr>"; $poradi = 0; } if (($poradi == 4) && ($poradi != 4)) continue; endwhile; Původně jsem to chtěla zkusit přepsat do řešení, na které jsi dával odkaz, ale zasekla jsem se na tom kdy tam je použit cyklus for, zatímco já začínám while(list($rok, ... .
Ale myslím, tento řádek by nebyl dobře: for ($i = 0; list($rok,$vyrobce,$sada) = mysql_fetch_assoc($navrat); $i++) |
||
Keeehi Profil |
#4 · Zasláno: 24. 10. 2017, 10:58:35
Lucyk:
„Ale myslím, tento řádek by nebyl dobře:“ Byl by dobře. |
||
Lucyk Profil |
Keeehi:
Tak to pak netuším, co tam mám špatně, neboť po nahrazení touto částí kódu mi to hlásí: Undefined variable: sloupce in Warning: Division by zero in define ("$sloupce", 4); // počet sloupců echo "<table>\n"; for ($i = 0; list($rok,$vyrobce,$sada) = mysql_fetch_row($navrat); $i++) { if ($i % $sloupce == 0) echo "<tr>"; echo "<td width=\"280\"><a href=\"index.php?rok=$rok&vyrobce=$vyrobce&sada=$sada\"></a></td>"; if ($i % $sloupce == $sloupce - 1) echo "</tr>\n"; } if ($i % $sloupce != 0) { while ($i++ % $sloupce != 0) { echo "<td> </td>"; } echo "</tr>\n"; } echo "</table>\n"; Pokud vyměním tento řádek: for ($i = 0; list($rok,$vyrobce,$sada) = mysql_fetch_assoc($navrat); $i++) Tak to hlásí Undefined variable: sloupce in Undefined offset: 2 in Undefined offset: 1 in Undefined offset: 0 in Tento řádek define ("$sloupce", 4); // počet sloupců neplní funkci definice proměnné?
Podařilo se mi upravit svůj stávající kód s while následovně, ale netuším, zda je to tak dobře, neboť u konce si nejsem jistá, zda tam není navíc echo "</tr>"; .
echo "<table id='tabulka_vypis'>"; echo "<tr>"; $poradi = 0; while (list($rok,$vyrobce,$sada) = mysql_fetch_row($navrat)): echo "<td width=\"280\"><a href=\"index.php?rok=$rok&vyrobce=$vyrobce&sada=$sada\"></a></td>"; $poradi++; if($poradi == 4) { echo "</tr><tr>"; $poradi = 0; } endwhile; if($poradi == 0) { echo "</tr>"; } else { while($poradi != 4) { $poradi++; echo "<td width=\"280\"> </td>"; } } echo "</tr>"; echo "</table>"; Sice to už nevypisuje prázdný řádek, ale nezdá se mi tam to, že když bude ($poradi == 0) , tak dojde k ukončení </tr> a plus ještě na konci kódu mám znovu ukončení </tr>, tzn. že je tam nyní 2x (přestože jsem nenarazila, že by se to projevilo negativně při výpisu)?
|
||
Tomášeek Profil |
#6 · Zasláno: 25. 10. 2017, 07:07:23
Lucyk:
„Tento řádek define ("$sloupce", 4); // počet sloupců neplní funkci definice proměnné?“
To je konstanta. Přiznávám, že nevím, co to udělá s dolarem na začátku, možná se proměnná nejprve vyhodnotí? Nevím. Proměnná se deklaruje stejně jako v #5 v posledním kódu na 3. řádu, tedy $sloupce = 4 .
„neboť u konce si nejsem jistá, zda tam není navíc echo "</tr>"; “
Ano, je, pokud je poradí rovno nule. Ale ničemu ve výsledku nevadí, ta druhá koncová značka je ignorovaná. Také ničemu nevadí, pokud je neuvedeš, koncová značka </tr>, stejně jako </td> a mnohé jiné jsou nepovinné, ukončí se sami, jakmile bude třeba. Ta podmínka na řádcích 12-19 pro vypsání prázdných buněk do plného počtu a navíc bez přebytečného konce řádku by mohla být (nevyzkoušeno) if ($poradi > 0 && $poradi < 4) .
|
||
Kcko Profil |
#7 · Zasláno: 25. 10. 2017, 09:57:30
Lucyk:
Než psát tenhle prasokód, ulož si výsledky cyklu do pole, pole rozděl funkcí php.net/manual/en/function.array-chunk.php a poté už bude velmi snadné provést operaci, kterou potřebuješ. |
||
Keeehi Profil |
#8 · Zasláno: 25. 10. 2017, 12:04:12
Je to naprosto jednoduché. Jen se k tomu musí přistupovat systematicky
echo "<table id='tabulka_vypis'>"; $i = 0; while (list($rok,$vyrobce,$sada) = mysql_fetch_row($navrat)) { if ($i % 4 == 0) { echo "<tr>"; } echo "<td width=\"280\"><a href=\"index.php?rok=$rok&vyrobce=$vyrobce&sada=$sada\"></a></td>"; if ($i % 4 == 3) { echo "</tr>"; } $i++; } if ($i % 4 != 0) { while($i % 4 != 0) { echo "<td width=\"280\"> </td>"; $i++; } echo "</tr>"; } echo "</table>"; |
||
Kcko Profil |
Keeehi:
Zas tak jednoduché ne, jak vidíš dle autorky vlákna ;-) Tohle mi přijde tedy čitelnější (a to je to zbytečně "komplikované" jen kvůli dopočítání prázdných buněk, což v případě tabulky žádný problém neudělá, takže to tam ani být nemusí). <?php $data = range(1, 9); $divideBy = 4; $chunks = array_chunk($data, $divideBy); $rowsTotal = count($chunks); $cellsToFill = $divideBy - count($chunks[$rowsTotal - 1]); echo "<table border=1>"; foreach ($chunks as $rowIndex => $cells) { echo "<tr>"; foreach ($cells as $cell) { echo "<td>"; echo $cell; echo "</td>"; } if ($rowIndex == $rowsTotal - 1 && $cellsToFill > 0) { for ($i = 0; $i < $cellsToFill; $i++) { echo "<td> </td>"; } } echo "</tr>"; } echo "</table>"; |
||
Keeehi Profil |
#10 · Zasláno: 25. 10. 2017, 13:45:41
Kcko:
Tak když se to zarovná, tak by to mohlo být ještě jednodušší. $data = range(1, 9); $divideBy = 4; $rows = array_chunk($data, $divideBy); $rowsTotal = count($rows); $rows[$rowsTotal-1] = array_pad($rows[$rowsTotal-1], $divideBy, null); echo "<table border=1>\n"; foreach ($rows as $row) { echo "<tr>\n"; foreach ($row as $cell) { echo "<td>"; echo $cell ?? ' '; echo "</td>\n"; } echo "</tr>\n"; } echo "</table>"; Proč ale zbytečně vytvářet pole a výsledky dvakrát procházet, když to stačí jen jednou? |
||
Kcko Profil |
Keeehi:
„Proč ale zbytečně vytvářet pole a výsledky dvakrát procházet, když to stačí jen jednou?“ Protože zvítězí čitelnost nad nicotnou operací (dvojí průchod) :) PS. Zbytečné se o tom dál bavit, at si Lucyk vybere sama. PS2. Řádek 5 je elegantní. |
||
Lucyk Profil |
#12 · Zasláno: 27. 10. 2017, 16:27:50
Keeehi:
„Je to naprosto jednoduché. Jen se k tomu musí přistupovat systematicky“ Děkuji, tento zápis je pro mě srozumitelnější. Vím, že u mého kódu už nastal ten problém, kdy jsem měla echo "<tr>"; ještě před začátkem samotného cyklu.
Kcko: „Než psát tenhle prasokód, ulož si výsledky cyklu do pole,“ Snažím se čerpat inspiraci u internetu, proto vznikl tento paskvil, který jsem upravovala dle svých potřeb. Jelikož vše testuji na stránkách webzdarma, tak už se mi nejednou podařilo si zacyklit výstup a pak je vždy musím žádat o obnovu :/ Na Tvůj návrh řešení se určitě kouknu a třeba najde u mě využití při sestavování dalších cyklů :) |
||
Časová prodleva: 5 let
|
0