Ongelma olisi se, että pitäisi saada tiedostosta tarkistettua löytyykö haettu kuva ko. tiedostosta.
Esimerkiksi in_array funktiota hyödyntäen:
<?php $tiedosto=array(eka,toka,kolmas); if (in_array("eka", $tiedosto)) { echo "Löytyi"; } else{ echo "Ei löytynyt"; } ?>
En kuitenkaa saa tuota sovitettua tiedoston lukuun useista yrityksistä huolimatta:
<?php $tiedosto = file("tiedosto.txt"); foreach ($tiedosto as $rivi => $arvo) { $tieto = explode("|", $arvo); $nimi = $tieto[0]; $kuva = $tieto[1]; } ?>
Tiedoston sisältö olisi:
Keijo|keijo.jpg
Teuvo|teuvo.jpg
Jorma|jorma.jpg
Hyviä vinkkejä otetaan kiitollisuudella vastaan.
Laita se yritelmäsi kokonaisuudessaan ihmeteltäväksi. Tuosta ei vielä selviä, mitä teet väärin.
Kuitenkin pari juttua:
- in_array ei etsi avainta vaan arvoa. Katso php.netin see also kohta ;-)
- jos kutsut file-funktiota noin, koodisi kuva-muuttujaan tulee rivinvaihto. sama tässä, apu löytyy php.netin dokkarista.
Kiitos LaNu vastauksestasi!
Loppukäyttökohde liittyy kuvatiedoston poistamiseen, sitä en ole vielä toteuttanut niin ei ole valmista esimerkkiä.
Eli tarkistetaan löytyykö tiedosto.txt:stä poistettavan kuvatiedoston nimi ja jos löytyy niin poistaminen estetään.
Tuon poistohomman tekeminen onnistuu muuten, mutta ongelmana on tuo tarkistaminen, että löytyykö kuvatiedoston nimi tiedosto.txt:stä.
Tiedosto.txt:n sisältö on tähän tyyliin:
Keijo|keijo.jpg
Teuvo|teuvo.jpg
Jorma|jorma.jpg
Tuossa yksi vaihtoehto mitä yritin, jossa tarkistetaan löytyykö tiedostosta teuvo.jpg:
Mietittävää: onko $kuva
taulukko? Voiko in_array
-funktiota käyttää merkkijonojen vertailuun? Tarvitseeko merkkijonojen vertailuun funktiota?
Mitä PHP sanoo ohjelmaa suorittaessa, jos varoitukset on kytketty päälle? Oletko ajanut sitä?
Tuon koodin kun ajaa, niin saan seuraavat virheilmoitukset:
Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt
Eli koodi kieppaa kolme kierrosta silmukassa. Tästä voimme todeta, että tiedosto saadaan luettua oikein. Manuaalista voimme lukea in_array(mixed $needle, array $haystack)-funktion haluavan etsittävän arvon ja taulukon, josta arvoa etsitään.
Koodista selviää helpolla, että toinen parametri ei suinkaan ole taulukko, vaan se on merkkijono. Muutetaan koodia poistamalla in_array-funktio ja korvaamalla se '===' operaattorilla.
Nyt koodi tulostaa 3-kertaa kuvaa ei löytynyt. Tämähän ei ole tarkoitus, vaan tarkoitus on tulostaa vain yksi lause. Poistetaan else haara silmukasta ja luodaan muuttuja $kuva_ok = false koodin alkuun. jos haluttu arvo löytyy tiedostosta, niin asetetaan $kuva_ok muuttuna true:ksi, muutoin sen annetaan olla false.
Lopuksi tehdään if-else haara $kuva_ok muuttujan mukaan tehdään tulostukset. Nyt kun ajetaan seuraava koodi, niin tulostuksien määrä on yksi, mutta tulostus itsessään on väärin. Korjaus jätetään harjoitukseksi.
Käytännössä silmukka kannattaa lopettaa heti, kun oikea arvo löytyy. Tällä tavalla suoritus nopeutuu hieman varsinkin jos arvo on heti tiedoston alkupuolella. Tällaisissa kolmen rivin tiedostossa ero on tietenkin aivan mitätön, mutta useamman tuhannen rivin tiedostossa ero voi olla melkoinen. Tosin tällöin jopa tietokanta voisi olla hyvä valinta.
Koodissa on toinenkin virhe: file-funktion palauttamassa taulukossa ovat mukana rivinvaihtomerkit ("\n"), jolloin rivin viimeinen solu ei ole "teuvo.jpg" vaan "teuvo.jpg\n". Ongelma ratkeaa parametrilla FILE_IGNORE_NEW_LINES:
$tiedosto = file('tiedosto.txt', FILE_IGNORE_NEW_LINES);
Jep tähän viittasinkin jo tuossa tovi sitten, mutta hyvä se on silti sanoa ääneen.
Kiitos kaikille vastauksista!
Ideasta sain hyvin kiinni Teuron loistavasta selvityksestä, kiitos siitä Teuro!
Kiitos Metabolix tuosta: FILE_IGNORE_NEW_LINES olikin uusi juttu!
Aihe on jo aika vanha, joten et voi enää vastata siihen.