Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Taulukon tulostus

Sivun loppuun

titityyana [09.09.2008 13:24:33]

#

PHP:lla luen tekstitiedoston rivit taulukkoon. Jokainen tekstitiedoston rivi sisältää x määrän eri asioita erotettuna | -merkillä. Explodella nuo saa siis eroteltua vielä toiseen taulukkoon.

Itse kysymys kuuluu, etä miten saisi tulostettua tekstitiedoston rivit tietyssä järjestyksessä, joka tässä tapauksessa tarkoittaa jokaisen rivin viimeisen alkion suuruusjärjestystä.

teksti.txt:

nro|aika|nimi|aihe|maika
nro|aika|nimi|aihe|maika

Taulukko1 sisältää teksti.txt -tiedoston rivit eri alkioissa. Taulukko2 sisältää taasen Taulukko1[0] teksti.txt -tiedoston ensimmäisen rivin tiedot, jotka ovat | -merkillä erotetut.

Miten siis saan tulostettua Taulukko1:n tiedot siinä järjestyksessä, joka vastaa Taulukko2[5] järjestystä? Eli tässä tapauksessa Taulukko1:n rivit tulisi tulostaa suuruusjärjestyksessä tiedon maika suhteen.

Ulosantini ei ole kauhean selvää, kysykää täsmennyksi jos on epäselvää.

Metabolix [09.09.2008 13:33:34]

#

<?php
# Vertailufunktio:
# $a < $b  <=>  $a - $b < 0  <=>  vertailu($a, $b) < 0
# $a = $b  <=>  $a - $b = 0  <=>  vertailu($a, $b) = 0
# $a > $b  <=>  $a - $b > 0  <=>  vertailu($a, $b) > 0
function vertailu($a, $b) {
  # poimitaan olennaiset osat
  $a = $a["maika"];
  $b = $b["maika"];
  # Vertailu käy näin näppärästi, ja suunnan voi vaihtaa vaihtamalla -1:n ja 1:n
  return ($a <= $b) ? ($a < $b) ? -1 : 0 : 1;
}

# lajitellaan taulukko, tulostus tämän jälkeen normaaliin tapaan.
usort($taulu, "vertailu");
?>

titityyana [09.09.2008 13:40:02]

#

Hmm.. pitää vähän tuumata tuota, että se menee ymmärryksen tasolla itselle jakeluun.

Mutta mitenkäs jos teksti.txt sisältää vaikka 100 riviä, eikä vain kaksi. Miten sen saisi automatisoitua niin, että ei tarvitse sataa eri muuttujaa lisätä ($a, $b, $c jne..).

Vai olenko vähän hakoteillä?

Metabolix [09.09.2008 13:47:36]

#

Olet vähän hakoteillä. Tutustu taulukoihin ja vaikkapa Putkan PHP-oppaaseen.

<?php
$rivit = file("teksti.txt");

echo "<h1>teksti.txt</h1>\n";

echo "<h2>foreach</h2>\n"
echo "<ol>\n";
foreach ($rivit as $rivi) {
  $rivi = trim($rivi);
  echo "<li>$rivi</li>\n";
}
echo "</ol>\n";

echo "<h2>for</h2>\n"
echo "<ol>\n";
for ($i = 0; $i < count($rivit); $i++) {
  $rivi = trim($rivit[$i]);
  echo "<li>$rivi</li>\n";
}
echo "</ol>\n";
?>

titityyana [09.09.2008 16:12:18]

#

Putkan opas tullu luettua joskus vajaa 3 vuotta sitten. Ja PHP:lla oon tehny useita sivustoja, kuvagallerioita ja kommentointijärjestelmiä. Et ehkä ihan ymmärtänyt kysymystäni.

echo"<tr><th>Otsikko</th><th>Aloittaja</th><th>Kirjoitusaika</th><th>Uusin viesti</tr>";
	for ($i = 0; $i < $keskustelumaara; $i++) {
		$keskustelufile[$i] = trim($keskustelufile[$i]);
		$keskustelutiedot = explode("|", $keskustelufile[$i], 5);
		$kid = $keskustelutiedot[0];
		$aloittaja = $keskustelutiedot[1];
		$aihe = $keskustelutiedot[2];
		$aloitusaika = $keskustelutiedot[3];
		$uusinviesti = $keskustelutiedot[4];
		echo"<tr><td><a href=\"?sivu=keskustelu&keskustelu=$kid\">$aihe</a></td><td>$aloittaja</td><td>" . date("d.m.Y H:i", $aloitusaika) . "</td><td>" . date("d.m.Y H:i", $uusinviesti) . "</td></tr>";
	}
	echo"</TABLE></div></div>";

Toi on tän hetkinen systeemi. Muuten hyvä, mutta en tiedä miten saisin tulostettua kyseiset asiat siten, että ne olisivat $uusinviesti (aika) mukaisessa järjestyksessä, eikä siinä järjestyksessä jossa ne tekstitiedostossa ovat listattuna.

Ymmärtääkö kukaan?

Laitinen [09.09.2008 16:22:41]

#

Metabolix esitti juuri järkevän tavan listan järjestämiseen, vaikka listassa olisi kuinka monta alkiota. Tuo usort käyttää tuota vertailu-funktiota taulukon eri alkioiden vertailuun, jolloin se luonnollisesti vertailee vain kahta alkiota kerrallaan.

Metabolix [09.09.2008 16:37:45]

#

titityyana kirjoitti:

Putkan opas tullu luettua joskus vajaa 3 vuotta sitten. Ja PHP:lla oon tehny useita sivustoja, kuvagallerioita ja kommentointijärjestelmiä. Et ehkä ihan ymmärtänyt kysymystäni.

Noin sitä on aina hyvä uhota, kun ei ymmärrä itse vastausta. >_>

Edelleenkin sen taulukon voi järjestää usort-funktiolla, kuten esimerkistäni näet. Joudut siis ensin hajottamaan rivit yhdessä silmukassa, sitten järjestämään taulukon ja vasta lopuksi tulostamaan sen.

Oikeassa olet siinä, että en tosiaan käsittänyt, mitä satoja muuttujia ($a, $b, $c, ...) olit lisäämässä. Jos viittasit tuohon vertailufunktioon (josta tosiaan $a ja $b löytyvätkin), niin se kyllä vertailee aina tasan kahta elementtiä.

Voisit myös opetella itse lukemaan PHP:n manuaalista, kuinka neuvottu funktio toimii.

Väännetään vielä nyt rautalangasta:

<?php
#$taulu = file("jotain.txt");
$taulu = array(
  "1|Pekka|Potsikko|".(time()-22309)."|".(time()-1100),
  "2|Matti|Motsikko|".(time()-19309)."|".(time()-1500),
  "3|Liisa|Lotsikko|".(time()-15309)."|".(time()-1000),
  "4|Terox|Totsikko|".(time()-12309)."|".(time()-1200),
);

$keys = array("kid", "aloittaja", "aihe", "aloitusaika", "uusinviesti");

foreach ($taulu as &$rivi) {
  # Tehdään rivistä taulukko
  $rivi = array_combine($keys, explode("|", trim($rivi)));
}
unset($rivi);

# Vertailufunktio
function vertailu($a, $b) {
  $a = $a["uusinviesti"];
  $b = $b["uusinviesti"];
  return ($a <= $b) ? ($a < $b) ? 1 : 0 : -1;
}

# Järjestetään
usort($taulu, "vertailu");

foreach ($taulu as $rivi) {
  # Haetaan rivin sisältö helppoihin muuttujiin
  foreach ($rivi as $var => $value) {
    $$var = $value;
  }
  # Tulostetaan. Huom. &amp; eikä &.
  echo "<tr>";
  echo "<td><a href=\"?sivu=keskustelu&amp;keskustelu=$kid\">$aihe</a></td>";
  echo "<td>$aloittaja</td>";
  echo "<td>", date("d.m.Y H:i", $aloitusaika), "</td>";
  echo "<td>", date("d.m.Y H:i", $uusinviesti), "</td>";
  echo "</tr>";
}
?>

titityyana [09.09.2008 16:56:36]

#

No uhota ei ollut tarkoitus. Mutta anteeksi kuitenkin käytökseni. Jokainen teistä varmasti osaa enemmän kuin minä. Ja kiitos vastauksista.


EDIT: ei vaan mee jakeluun. Tossa on niin monta uutta asiaa, että vähän hankala hoksata tota toimintaperiaatetta. Mutta ei maha mittään.

titityyana [11.09.2008 16:45:03]

#

Ratkaisin ongelman patenttiratkaisulla. Muutin homman siten, että $uusinaika on rivillä aina ensimmäinen tieto. Sen jälkeen vaan rsort(teksti.txt) ja homma toimii. Hieman se on purkka, mutta ei voi mitään.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta