Autor Zpráva
Tomáš123
Profil
Ahoj
Potreboval by som, aby mi PHP skript po obdržaní vstupu od užívateľa vytvoril tabuľku podľa zadaného počtu stĺpcov a riadkov. V HTML sa však nanešťastie tabuľky tvoria kaskádovo. Môj problém spočíva v tom, že neviem ako určité množstvo buniek obaliť riadkom. Funkcia na tvorenie buniek vyzerá takto:
<?php
    function createCols($cols, $defltCols=0) {
        if ($cols > $defltCols) {
            echo "<td>a</td>\n";
            $defltCols++;
            createCols($cols, $defltCols);
        }        
    }
    $cols = 8;
    echo "<table border=1><tr>";
    createCols($cols);
    echo "</tr></table>";
?>

Druhá funkcia by mala zistiť, aký počet riadkov si užívateľ vyžiadal a pred každou sériou buniek riadok otvoriť <tr>, a na konci zas uzavrieť </tr>.

Ak existuje jednoduchší spôsob ako vytvoriť tabuľku požadovanej veľkosti, budem rád ak ma s ňou zoznámite.

Vopred ďakujem za rady
lionel messi
Profil
Tomáš123:
Neštudoval som to podrobne, ale Základní kurz 11: Cykly nepomôže?
Tomáš123
Profil
lionel messi:
Neštudoval som to podrobne, ale Základní kurz 11: Cykly nepomôže?
Nie, tu ide o pomoc pri vymyslení princípu. Prečítal som si zlú časť textu. Skúsim teda niečo vytvoriť :)
Tomáš123
Profil
Skúsil som to podľa péhapka... Výsledok vyzerá takto:
<?php
    $rows = 5;
    $cols = 4;
    $value = "value";
    echo "<table border=1>";
    for ($defltRows = 1, $rows == $deftRows, $defltRows++) {
        echo "<tr>";
            for ($defltCols = 1, $cols == $defltCols, $defltCols++) {
                printf ("<td>%s</td>", $value);
            }
        echo "</tr>";
    }
    echo "</table>";
?>
A jediné na čo sa tento skript zmohol je chybová hláška, ktorá hlása, že na riadku číslo 6 sa očakáva ';' namiesto ')'.

Viete mi napísať, čo je na to skripte zle a ako ho prerobiť, aby robil to, čo potrebujem?

Ďakujem
lionel messi
Profil
Tomáš123:
A jediné na čo sa tento skript zmohol je chybová hláška, ktorá hlása, že na riadku číslo 6 sa očakáva ';' namiesto ')'.
Skús:

  <?php
    $rows = 5;
    $cols = 4;
    $value = "value";
    echo "<table border=1>";
    for ($defltRows = 1; $rows >= $deftRows; $defltRows++) {
        echo "<tr>";
            for ($defltCols = 1; $cols >= $defltCols; $defltCols++) {
                printf ("<td>%s</td>", $value);
            }
        echo "</tr>";
    }
    echo "</table>";
?>
S operátorom priradenia to fungovať rozhodne nebude, Tentokrát som si to zle pozrel ja, operátor čiarky má vo for iný význam, než oddelenie jednotlivých častí.
mimochodec
Profil
Nechci se vám do to míchat, ale správná syntaxe for je
for ($i = 1; $i <= 10; $i++) {
  echo $i;
}
TomasJ
Profil
Tomáš123:
A jediné na čo sa tento skript zmohol je chybová hláška, ktorá hlása, že na riadku číslo 6 sa očakáva ';' namiesto ')'.
Logicky, protože cyklus má vypadat takto:
for(deklarace proměnné; podmínka; akce) { }
for($i = 0; $i < $pocetNeceho; $i++) { }

Edit:
Mám dobrou náladu tak pomůžu při tvorbě.
function vytvorSloupceTabulky($obsahSloupcu) {
    $vystup = Array();
    foreach($obsahSloupcu as $sloupec) {
        array_push($vystup, "<td>{$sloupec}</td>");
    }
    return implode("\n", $vystup);
}

$sloupce = Array("prvni", "druhy");
echo "<table><tr>";
echo vytvorSloupceTabulky($sloupce);
echo "</tr></table>";
lionel messi
Profil
mimochodec:
Nechci se vám do to míchat,
Pokojne sa nám, 2 amatérom, do toho miešaj aj naďalej, svoj omyl som si vzápätí uvedomil, ale lepšie opraviť 2-krát, ako ani raz. :-)
Tomáš123
Profil
mimochodec, TomasJ:
A víťazom sa stáva mimochodec s náskokom 16 sekúnd. Blahoželáme.

mimochodec, TomasJ, lionel messi:
Chyba bola tam. Po úprave však skript neurobí absolútne nič. Nevypíše chybu, ani nezobrazí požadovaný obsah.

Aktuálna verzia:
<?php
    $rows = 5;
    $cols = 4;
    $value = "value";
    echo "<table>";
    for ($defltRows = 1; $rows == $defltRows; $defltRows++) {
        echo "<tr>";
            for ($defltCols = 1; $cols == $defltCols; $defltCols++) {
                echo "<td>.$value.</td>";
            }
        echo "</tr>";
    }
    echo "</table>";
?>
mimochodec
Profil
Tomáš123:
Já jsem hlavně úplně nepochopil, čeho chceš dosáhnout. Můžeš se vyhnout slovům kaskádovo a rekurzia a popsat, co vlastně chceš?
Tomáš123
Profil
mimochodec:
Můžeš se vyhnout slovům kaskádovo a rekurzia a popsat, co vlastně chceš?
kaskádovo = Bunka tabuľky je v riadku tabuľky.
<tr>
  <td>Obsah
  </td>
</tr>

Preto mám problém vytvoriť skript, ktorý by mi podľa vstupu (v podobe 2 čísel, teda počtu riadkov a počtu stĺpcov) vytvoril požadovanú tabuľku.

TomasJ:
Mám dobrou náladu tak pomůžu při tvorbě.
Ďakujem za snahu, ale problém je v niečom inom. O pár riadkov vyššie som sa to snažil vysvetliť momochodcovi.
mimochodec
Profil
Tomáš123:
Já bych o nějaké kaskádovitosti nebo rekurzi mluvil až kdyby se vkládaly tabulky do tabulek apod.

echo "<table>";
for ($i = 1; $i <= $pocetradku; $i++) {
  echo "<tr>";
  for ($j = 1; $j <= $pocetsloupcu; $j++) {
    echo "<td>".($i*$j)."</td>";
  }
  echo "</tr>";
}
echo "</table>";

edit: opraven překlep
Tomáš123
Profil
mimochodec:
Já bych o nějaké kaskádovitosti nebo rekurzi mluvil až kdyby se vkládaly tabulky do tabulek apod.
Možno som to zbytočne prehnal, každopádne, jediný rozdiel medzi tvojim a mojim kódom je v názve premenných a operátoroch porovnávania. Teoreticky mám rovnaký skript ako ty (čo mi celkom lichotí, lebo som iba začiatočník). Jediný viditeľný rozdiel je v sfarbení HTML kódov (zatiaľ čo ty máš kód červenou, ja mám červené iba niektoré úvodzovky)... Nevidíš nejakú chybu v mojom kóde? Alebo je rozdiel v tom, že so použil printf?

Dík za kód ;)

Rozdiel v kóde je ešte na riadku 5. Čo si mienil týmto ($i*$j)?
mimochodec
Profil
Tomáš123:
Já vidím hlavní přednost toho svého v tom, že v těch cyklech inkrementuju, dokud není dosaženo hodnoty, zatímco ty bys inkrementoval v případě, že proměnná, kterou jsi nastavil na 1, by dosáhla 5, k čemuž jí nijak nepomáháš :)

Čo si mienil týmto ($i*$j)?
Abych tu tabulku nenechal úplně prázdnou, pojal jsem ji jaiko násobilku do deseti.

A ještě technicky: toto opravdu není rekurze. Rekurze je, když uvnitř funkce použiješ právě ji.
Tomáš123
Profil
mimochodec:
zatímco ty bys inkrementoval v případě, že proměnná, kterou jsi nastavil na 1, by dosáhla 5, k čemuž jí nijak nepomáháš :)
Aj po zmenení operátora na "<=" je výsledok rovnaký ako v [#9].

A ještě technicky: toto opravdu není rekurze. Rekurze je, když uvnitř funkce použiješ právě ji.
To viem. V [#1] to ešte bola rekurzia... Potom lionel navrhol príkaz for a odvtedy už to rekurziou nenazývam :).
TomasJ
Profil
Tomáš123:
Ďakujem za snahu, ale problém je v niečom inom. O pár riadkov vyššie som sa to snažil vysvetliť momochodcovi.

Tys mě nepochopil, poslal jsem ti tvoje "vymyšlení principu". Neposílal jsem ti celý kód. Očekával jsem, že do toho vložíš vlastní iniciativu a ten "můj" princip si rozšíříš.
Jinak ten cyklus v [#9] ti nejde proto, že sis nečetl můj příspěvek [#7], kde máš napsané, jak má vypadat syntakticky správný zápis cyklu a jaké obsahuje hodnoty.

Zároveň porovnáváš, jestli maximální počet je menší nebo roven aktuálnímu počtu (což je při prvním spuštění cyklu podmínka 5 <= 1) a to se nikdy nesplní.

[#12] mimochodec:
Tento tvůj cyklus pojede o 1 řádek a 1 buňku méněkrát, jelikož počáteční stavy proměnných $i a $j jsou 1. Aby se vykonal cyklus tolikrát, kolik je v proměnné $pocetXXX, musí být počáteční hodnota 0, nebo operátor z < na <=.
Tomáš123
Profil
TomasJ:
Tys mě nepochopil, poslal jsem ti tvoje "vymyšlení principu".
Iste, prepáč. Očividne však zatiaľ nie som schopný tvoje riešenie pochopiť. Je to na mňa príliš zložité.

Jinak ten cyklus v [#9] ti nejde proto, že sis nečetl můj příspěvek [#7], kde máš napsané, jak má vypadat syntakticky správný zápis cyklu a jaké obsahuje hodnoty.
Už viem, ďakujem.

Čudoval som sa, prečo mi mimochodcov skript funguje a ten môj nie. Problém bol v opačnom porovnávaní premenných. Môj problém bol v tom, že či už bola jedna strana menšia, rovná alebo väčšia ako počet riadkov resp. stĺpcov, pre druhú stranu to neznamenalo absolútne nič. Preto ani skript nič nevypísal. Teraz som vymenil poradie z $rows <= $defltRows na $defltRows <= $rows a už to funguje aj mne. Ak by nebol jasný koreň problému, pridávam súčasný kód:
<?php
    $rows = 5;
    $cols = 4;
    $value = "value";
    echo "<table border=1>";
    for ($defltRows = 1; $defltRows <= $rows; $defltRows++) {
        echo "<tr>";
            for ($defltCols = 1; $defltCols <= $cols; $defltCols++) {
                echo "<td>a</td>";
            }
        echo "</tr>";
    }
    echo "</table>";
?>

Ďakujem Vám všetkým za nakopnutie správnym smerom.

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: