Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: viisi uusinta sivua

Sivun loppuun

juhaz [06.02.2005 19:58:04]

#

Kuinka saisin näytettyä sivulla viisi uusinta sivua? Sivut haetaan eräästä hakusanat.txt tiedostosta, jossa ne on tiedoston ihan lopussa tyyliin

hakusana:hakusanan otsikko:hakusanan tiedot#http://osoite.com

Antti Laaksonen [06.02.2005 20:06:14]

#

Tuottaako ongelmia viimeisten rivien poimiminen, linkkien muodostaminen vai jokin muu? Mitä linkkien teksteiksi tulee?

juhaz [06.02.2005 20:26:48]

#

Öh? :D

pitäisi siis vain saada näytettyä hakusanat.txt tiedostossa olevat viisi viimeistä (eli uusinta) sivua, ei ole ongelmia paitsi webmasterin kädettömyys (ei osaa PHP:tä) :D

Kyllä mä olen yrittänyt harjoitella, mutta tällä hetkelläkään en osaa kuin sen verran PHP:tä, että osaan lähinnä laittaa tekstiä ruutuun

<?php
echo("tekstiä");
?>

ja osaan hieman lukea koodia ja sen toimintaa, mutta oman koodin tuottaminen on vielä hankalaa.

tsuriga [06.02.2005 20:32:04]

#

No eipä sitten muuta kuin harjoittelun iloa :) (valmista koodia ei olisi tarkoitus antaa)

Tomi [06.02.2005 23:37:14]

#

Paljastamatta koko ratkaisua: kokeile näitä asioita: file(), array_reverse() ja sit foreach().

https://www.php.net/manual/en/function.file.php
https://www.php.net/manual/en/function.array-reverse.php
https://www.php.net/manual/en/language.control-structures.php

Tuolla pitäisi jo päästä aika pitkälle. Harjoittelun iloa :-)

T.M. [07.02.2005 00:47:51]

#

En suosittele taulukon kääntämistä nurinperin jollain funktiolla, ellei sille ole pakonomaista tarvetta.

Käyttämällä for-silmukkaa, voit helposti käydä taulukkoa läpi takaperin.

Olga [07.02.2005 15:30:46]

#

T.M. kirjoitti:

En suosittele taulukon kääntämistä nurinperin jollain funktiolla, ellei sille ole pakonomaista tarvetta.

Käyttämällä for-silmukkaa, voit helposti käydä taulukkoa läpi takaperin.

Parin sekunnin tuhannesosan menetys vs. koodin selkeys ja ymmärrettävyys. Jokainen valitkoot oman tapansa :)

T.M. [07.02.2005 21:31:53]

#

Mjaa... onkohan näin? Käännäppäs tuolla funktiolla miljoona riviä niin huomaat eron.

Ja miksi niitä huonoja tapoja on aivan pakko opetella?

Vielä varottaisin käyttämään noita PHP:n array-funktioita, etenkin array_map() funktiota missään vähänkään suuressa taulukossa.
Syyt: hitaus, muistin kulutus, purkkamenetelmä.

Joidenkin array-funktioiden nopeus on jopa pienempi kuin tavallisella foreach-silmukalla koodattu systeemi.

Olga [07.02.2005 21:37:43]

#

Sitten kun tekstitiedostosta löytyy miljoona riviä, lienee paikallaan katsoa peiliin. PHP:n valmiit funktiot ovat tehty käytettäviksi, ja ainakin itselleni tuo koodin selkeys on tärkeämpi seikka kuin noiden muutamien tuhannesosien voittaminen. Mutta kuten sanottua, jokainen saa valita oman tapansa.

T.M. [07.02.2005 21:41:12]

#

Sen kyllä huomaa miten typerä on ollut PHP:tä koodatessa, kun siirtyy esimerkiksi C-kieleen :)

Olga [07.02.2005 22:05:08]

#

T.M. kirjoitti:

Sen kyllä huomaa miten typerä on ollut PHP:tä koodatessa, kun siirtyy esimerkiksi C-kieleen :)

Onneksi itselläni tuo siirtyminen tapahtui juurikin toisinpäin... :)

T.M. [07.02.2005 23:13:12]

#

Ai? No ei kyllä uskois, kun käyttelet tuolla tavalla PHP:n funktioita.
No jokaisella tapansa, kuten sanoit.

Antti Laaksonen [08.02.2005 06:53:36]

#

Minäkään en varmaan tässä tilanteessa kääntäisi koko taulukkoa, mutta muuten olen kyllä samoilla linjoilla Olgan kanssa. Skriptiä kannattaa optimoida vasta sitten, kun sen ylimääräisen hitauden todella huomaa todellisessa käyttötilanteessa. Ainakin minulle näin käy vain ani harvoin.

Taulukon viiden viimeisen alkion näyttäminen for-silmukan avulla:

<?php

$tiedot = range(1, 10);

for ($i = count($tiedot); $i >= count($tiedot) - 5; $i--) {
    echo "<p>" . $tiedot[$i] . "</p>";
}

?>

Tomi [08.02.2005 09:19:37]

#

T.M. kirjoitti:

Ja miksi niitä huonoja tapoja on aivan pakko opetella?

Toisen huonotapa on toisen käytännöllisyys. Itse ainakin harvoin olen nähnyt PHP skripteissäni minkäänlaista nopeuden vähenemistä, ellen sitten tee mittausta sekunnin sadas- ja tuhannesosissa.

Mitä nyt juhazille ehdotin oli vain nopea ratkaisu, enkä ensimmäisenä miettinyt että onko tämä nyt paras tapa. Jos mietitään fiksua koodaamista niin itse en ainaakaan laittaisia tällaista järjestelmää tekstitiedoston varaan vaan laittaisin tämän kaiken tietokantaan ja tekisin kyselyt sql:llä. Parhaimman tuloksen kun käyttää kyselyä joka palauttaa juuri sen mitä halutaan, ettei PHP:tä edes tarvitse käyttää tulosten parsaamiseen vaan ne voi suoraan vain tulostaa.

T.M. [08.02.2005 14:03:54]

#

Antti, koodissasi on virhe.
Tässä korjattu + optimoitu ;)

<?php

$tiedot = range(1, 10);
$max = count($tiedot);

for ($i = $max-1; $i >= $max-5; $i--) {
    echo "<p>" . $tiedot[$i] . "</p>";
}

?>

Niin ja tuosta array_reverse() käytöstä, että sen käytön typeryyden huomaa vasta sitten kun kääntelee sillä isompia filuja. Jos ei tiedä sen hitautta aikaisemmin, voi alkaa ihmetellä minkä takia scripti on niin hidas.

Ja jos on mahdollista kiertää jonkin funktion käyttö, niin miksi pitää olla käyttämättä sitä nopeampaa tapaa? Tuossa tapauksessa koodin selkeys ei huonone.
En ole huomannut tilannetta jossa optimoitu koodini olisi sekavampi kuin optimoimaton. Yleensä siinä käy juuri toisinpäin, kun koodimääräkin vähenee optimoimisen yhteydessä.

Toki matemaattiset laskutoimitukset menettävät selkeytensä, mutta harvemmin PHP:llä väännetään mitään korkeamman matematiikan tehtäviä.

Jos on kyse jostain demoefektistä, niin siinä tapauksessa optimoitu koodi menettää selkeytensä, ja on täten myös vaikeammin muokattavissa.
Mutta kun tehdään PHP:llä jotain raskasta tietojenkäsittelysysteemiä, niin siinä ei pitäisi koodin mennä niin pahasti solmuun jos kiertää muutaman funktion käytön, jollain järkevämmällä rakenteella :)

Toki noita valmiita funktiota on kätevä käyttää joissain pienissä jutuissa, mutta en suosittele ottaa tavakseen käyttää noita funktioita aina.

esakom [08.02.2005 14:22:33]

#

T.M. kirjoitti:

Jos ei tiedä sen hitautta aikaisemmin, voi alkaa ihmetellä minkä takia scripti on niin hidas.

kun tämä nyt kerran meni optimointikeskusteluksi, niin eikö niitä eri toteutustapoja kannattaisi verrata esim. prosentteina eikä suoraan millisekunteina. Kun yleensä kehitysvaiheessa testiaineisto on pieni, niin eihän siinä silmä juuri erota suoriutuuko joku toiminto kymmenessä vai sadassa millisekunnissa. (eroa 90 ms) Prosentteina (tai yleensäkin suhteessa alkuperäiseen) tuo ero onkin jo aika suuri. Ja sitten kyllä usein käy niin kuin T.M. jo sanoi että myöhemmin sitten ihmetellään että onpas hidasta. Kun muistaa joskus kirjoittaneensa koodin johonkin tehtävään, niin silloin on kyllä taipumusta käyttää juuri sitä pätkää, kuin että kirjoittaisi saman uudestaan. Yleensä vielä copypastella. Siinä vaiheessa sitten sen "bugin" metsästäminen onkin vaikeampaa, kun alkuperäinen idea ei välttämättä ole enää niin selvänä mielessä.

T.M. kirjoitti:

En ole huomannut tilannetta jossa optimoitu koodini olisi sekavampi kuin optimoimaton. Yleensä siinä käy juuri toisinpäin, kun koodimääräkin vähenee optimoimisen yhteydessä.

Yleensä asia on juuri näin. Usein optimoitaessa käy niinkin päin että on kirjoittanut jonkun funktion ja sitten huomaa että on olemassa valmis funktio joka hoitaa saman asian nopeammin.

Tomi [08.02.2005 15:36:43]

#

Kylläpäs tämä nyt paisui.

T.M. kirjoitti:

Niin ja tuosta array_reverse() käytöstä, että sen käytön typeryyden huomaa vasta sitten kun kääntelee sillä isompia filuja. Jos ei tiedä sen hitautta aikaisemmin, voi alkaa ihmetellä minkä takia scripti on niin hidas.

Yleensä kehittäjä minulla on hyvä käsitys siitä mitä tekstitiedostoihini laitan. Kun teen skriptejä, yleensä suunnittelen sen toimimaan tietyissä puitteissa. Tässä tapauksessa tietäisin kuinka paljon dataa olisin mahdollisesti tallentamassa hakusanat.txt -tiedostoon. Jos kyse olisi miljoonista, niin kuin joku ehdotti, tuskin edes avaisin sitä file() funktiolla. Käyttäisin ehkä tiedostokahvoja, tai parempaa, tietokantaa. Jos tiedän että tuskin kyseessä on tuhansista riveistä, käyttäisin ehdotettua for() silmukkaa. Jos tietäisin että kyse on sadoista riveistä, käyttäisin kevyinmielin foreach() silmukkaa. Näin ainakin itse suunnittelen skriptejäni. Koodia kirjoittaessa on vain käytännöllistä ottaa huomioon tarpeet jotka alunperin ajoivat tekemään sitä koodia. So what jos skripti ei ole käytännöllinen jos siihen tallentaa kymmeniätuhansia rivejä tekstiä. En usko että juhazin tarpeet menevät niin pitkälle.

T.M. kirjoitti:

Ja jos on mahdollista kiertää jonkin funktion käyttö, niin miksi pitää olla käyttämättä sitä nopeampaa tapaa?

PHP:n kehityksessä on satsattu aika paljon alemassa olevien algoritmien käyttämiseen nopeimmalla mahdollisella tavalla. Mielestäni on myös yhtä kummallista rakentaa oma viritelmä, jos kerran PHP:llä on oma funktio jonkin asian tekemiseen.

T.M. [08.02.2005 21:07:29]

#

lainaus:

Mielestäni on myös yhtä kummallista rakentaa oma viritelmä, jos kerran PHP:llä on oma funktio jonkin asian tekemiseen.

Jaaha.

Kumpi selkeämpi?

1.

<?php

$filu = file("testi.txt");
$filu = array_slice($filu, -5); // halusimme vain 5 tulosta
$filu = array_reverse($filu);

foreach($filu as $rivi){
    print $rivi."<br>";
}

?>

2.

<?php

$filu = file("testi.txt");
$max = count($filu);

for($u = $max-1; $u >= $max-5; $u--){
    print $filu[$u]."<BR>";
}

?>

Mielestäni tuo alempi koodi näyttää vähemmän omalta viritelmältä

tsuriga [08.02.2005 22:27:50]

#

Tuosta toisesta ei niin helposti käy ilmi haluttujen tulosten määrä, kun pitää miettiä, mitä for-lause tekee.

Metabolix [08.02.2005 22:46:12]

#

No kun nyt tästä tapellaan, niin kirjoitetaan tuo toinen ehdotus vielä vähän selkeämmin:

<?php
$tiedosto = file("testi.txt");
$viimeinen = count($filu) - 1;

for ($x = $viimeinen; $x > $viimeinen - 5; $x--){
    echo $tiedosto[$x]."<BR />";
}
?>

Eikös tuosta jo näy se -5 aika selkeästi? Ja kun on hetken ohjelmoinut, niin kyllä se for-lauseen toiminta pitäisi ymmärtää, jos se on noin helppo for-lause. Ja printiä ei tueta :)

tsuriga [08.02.2005 23:08:31]

#

Itsehän käyttäisin edelleen tapaa yksi, jos vaan muistan nuo kaksi array-funktiota ulkoa, ei tarvitse lähteä miettimään for-lauseen toimintaa ollenkaan. Optimointia sitten jos on tarvetta. <br /> :)

Olga [08.02.2005 23:53:51]

#

Tomi kirjoitti:

PHP:n kehityksessä on satsattu aika paljon alemassa olevien algoritmien käyttämiseen nopeimmalla mahdollisella tavalla. Mielestäni on myös yhtä kummallista rakentaa oma viritelmä, jos kerran PHP:llä on oma funktio jonkin asian tekemiseen.

tsuriga kirjoitti:

Itsehän käyttäisin edelleen tapaa yksi, jos vaan muistan nuo kaksi array-funktiota ulkoa, ei tarvitse lähteä miettimään for-lauseen toimintaa ollenkaan. Optimointia sitten jos on tarvetta.

Aamen.

T.M. [13.02.2005 18:06:12]

#

Tomi kirjoitti:

PHP:n kehityksessä on satsattu aika paljon alemassa olevien algoritmien käyttämiseen nopeimmalla mahdollisella tavalla.

Enpä nyt noinkaan sanoisi... osa PHP:n funktioista näyttää olevan aika purkasti tehtyjä :p

$color = ($r << 16) | ($g << 8) | $b;
on nopeampi kuin... imagecolorallocate()

$round = (int)($numero+0.5);
on nopeampi kuin... round($numero)

Enpäs nyt muita esimerkkejä jaksa etsiä, joten nuo riittänee.

ajv [13.02.2005 21:32:57]

#

Ja tästä päästään taas kysymykseen, mitä tarkoittaa purkka. Väittäisin, että php:n funktiot eivät ole purkkaa. Oma käsitykeni purkasta:
"purkka on huonosti toteutettu viritys, jolla paikataan jotain suurempaa virhettä. Koodi venyy ja paukkuu ja selkeys häviää sen sen mukana"

Purkka ei todellakaan tarkoita hidasta koodia.

Ja ihan mielenkiinnosta, mitä hyödytään käyttämällä $round=(int)($numero+0.5) round($numero):n sijasta? 0,0000001s? Ja mitähän merkitystä tällä on koodin toiminnan kannalta? Kyllä selkeys voittaa tuon 0,0000001s ainakin minun koodaustyylissäni.

Aamen myös minun osaltani. Kokemuksesta tiedän, että T.M.:ltä trollaus onnistuu.

T.M. [13.02.2005 22:28:51]

#

ajv kirjoitti:

Ja ihan mielenkiinnosta, mitä hyödytään käyttämällä $round=(int)($numero+0.5) round($numero):n sijasta? 0,0000001s? Ja mitähän merkitystä tällä on koodin toiminnan kannalta? Kyllä selkeys voittaa tuon 0,0000001s ainakin minun koodaustyylissäni.

30% nopeampi tuo esittämäni tapa, ja se on paljon nopeuden kannalta. Mutta tässä tapauksessa pointtini ei ollut se, onko jokin hyödyllistä koodin kannalta, kerroin vain ettei ne PHP:n funktiot ole "huippuunsa optimoituja". Kuten tuossa ylempänä väitettiin.

Eikö keskusteluissa saa korjata toisten väitteitä lainkaan?
Mielestäni jokaisella on oikeus tähän.

lainaus:

Kokemuksesta tiedän, että T.M.:ltä trollaus onnistuu.

Jahas. Haukuppa samalla peeloksi ja [lisää tähän muutama haukkumasana], niin eiköhän se siitä parane.

exAtuu [14.02.2005 17:58:57]

#

Aah, tämä on sitä putkaa itseään :) Pieni asia, iso väittely.

juhazia neuvon vaihtamaan monet erottimet yhdeksi erottimeksi, jolloin rivit näyttävät tältä:

hakusana|###|hakusanan otsikko|###|hakusanan tiedot|###|http://osoite.com|###|

Huomaa erotin viimeisen arvon perässä, tämä estää rivinvaihdon mukaanhyppimisen. Koodi taas näyttäisi tältä:

<?php
$file = file("hakusanat.txt");
$max = count($file) -1;

for ($i = $max; $i > $max - 5; $i--) {
  $tieto = explode("|###|", $file[$i]); //nyt linkin tiedot löytyvät tyyliin: $tieto[0] = hakusana, $tieto[1] = hakusanan otsikko...
  echo "<a href=\"{$tieto[3]}\">{$tieto[$0]}</a><br />\n";
}
?>

Ja nyt mukaan väittelyyn. Miksi tein näin? Itse en koodien nopeuksista tiedä piirun vertaa, mutta selkeyteen voin vedota. Lisäksi haluan sanoa, että on naurettavaa olla käyttämättä for-silmukkaa, koska ei ymmärrä sitä. For-silmukka on niin perusasiaa, että on aika suunnata kirjastoon, mikäli sen kanssa on ongelmia.

Viittaan seuraavissa esimerkeissä T.M.:n kirjoittamiin esimerkkeihin.

1. Avaa tiedoston sisältö erottaen jokainen rivi omaksi alkioksi taulukossa. Luo uusi taulukko taulukon viidestä viimeisimmästä alkiosta. Käännä uusi taulukko ylösalaisin. Käy taulukko läpi tulostaen sen alkiot.

2. Avaa tiedoston sisältö erottaen jokainen rivi omaksi alkioksi taulukossa. Lue ja tulosta taulukon viisi viimeistä alkiota aloittaen viimeisimmästä alkiosta.

EDIT: pikku viilausta

tsuriga [14.02.2005 20:30:50]

#

Mitä hyötyä on laittaa noin pitkä erotin? Mieluummin vaikka chr(7).

exAtuu [15.02.2005 09:01:17]

#

Eihän siitä varmaan mitään hyötyä tule, mutta tuskin haittaakaan. Voihan tuon helposti vaihtaa, mikäli haitaksi syntyy.

tsuriga [16.02.2005 14:54:31]

#

Unohtu sanoa: pitkä erotin vie enemmän (turhaa) tilaa.

remontti-reiska [16.02.2005 16:31:28]

#

Kukaan ei varmasti tee täysin puhtaan selkeää ja nopeaa koodia ensimmäisellä kirjoitus kerralla. Optimoida pystyy aina.

Hidasta funktiota ei ole järkevä käyttää edes vähissä datamäärissä, perusteluita tuskin kaivataan.

Tekstitiedoston koko ei tuosta erotinmerkistä tuskin kasva nimeksikään(selkeydestä en sano mitään, paitsi sen, että tuo käy silmään). Ja mitä väliä vaikka kasvaisikin. Kiintolevyn koko tuskin on ongelma ja koodin nopeus on kuitenkin hyvällä mallilla, kun ei niitä hitaita funktioita tms. käytetä.

Olga [16.02.2005 17:45:09]

#

Voi nyt jo jeesus. Kyseessä on sekunnin tuhannesosat ja niin pieniä ajanjaksoja ei ihmissilmä eikä -mieli edes tajua. Sitten ku ero on jo selvästi huomattavissa ja siitä on haittaa, voi alkaa optimoimaan.

Tyhmä saa olla, muttei liian tyhmä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta