Avatar billede Slettet bruger
22. juni 2003 - 02:25 Der er 52 kommentarer og
1 løsning

Array der henter en filstruktur

Hvordan skrives et array, der læser samtlige filer i en struktur med en bestemt extension, henter en bestemt linje fra de ti nyest redigerede filer, og poster dem?

Har forgæves rodet rundt i readDir() og array_search() osv, uden resultat.
Avatar billede jakoba Nybegynder
22. juni 2003 - 03:30 #1
"i en filstuktur"  betyder det en mappe og alle den mappes undermapper, etc

sekvensen vil være noget i retning af:

1) gennemløb filstrukturen og find filer med den ekstension
2) De til hver en tid 10 senest redigerede huskes i et array med 10 celler, sammen med deres opdateringsdato.
3) efter gennemløbet tages den der linie fra de 10 filer i arrayet.

tilsidst postes de (hvad det så betyder?)
Avatar billede Slettet bruger
22. juni 2003 - 12:50 #2
Ja, det er jeg klar over.. men hvordan skrives det?!
Avatar billede jakoba Nybegynder
22. juni 2003 - 13:51 #3
Det kan jeg ikke svare dig på før du fortæller klar og tydeligt hvad det er du vil.

hvad mener du med "en filstruktur"?
hvad karakteristisk er der ved din "en bestemt linie" som vi kan bruge til at finde den?
hvad er det "at poste"?
Avatar billede Slettet bruger
22. juni 2003 - 18:25 #4
En filstruktur mener jeg en samling af mapper og undermapper, der indeholder forskellige filer, både billedfiler, html og php filer, og af dem skal filerne med extention'en *.dat.php læses.

En bestemt lije, er den 6. linje i de 10 senest redigerede filer, hvor der starter en linje der begynder med "$archive_text"

Det er muligt jeg bruger "poste" forkert... jeg mener at de ti textstrenge skal hentes fra de ti filer, og samles på en oversigt...

Så på den måde har man en oversigt over de 10 senest skrevede kommentarer i et kommentar-system...
Avatar billede Slettet bruger
22. juni 2003 - 18:27 #5
Oh no.. dvs... det skal rent faktisk hentes fra den 3-sidste linje i filen, ikke den 6.
Avatar billede jakoba Nybegynder
22. juni 2003 - 19:29 #6
det bliver så noget i retning af:

<?php

class Find_ti {
    var $ti_sidste_filer;
    var $ti_sidste_tider;

    function Find_ti() {
        $this->ti_sidste_filer = array();
        $this->ti_sidste_tider = array();
    } // end constructor Find_ti( )

    function sift( $fil ) {
        $tid = filectime( $fil );
        if ( count( $this->ti_sidste_filer ) < 10 ) {  // endnu ikke fundet 10
            $this->ti_sidste_filer[] = $fil;
            $this->ti_sidste_tider[] = $tid;
        } else {                        // har allerede 10 så skrot den ældste
            $mintid = $tid;  // finder mindste tid ( mindst == ældst )
            $minindex = 11;  // og index hvor mindste tid ligger
            for ( $i=0; $i<10; $i++ ) {  // find mindste
                if ( $mintid > $this->ti_sidste_tider[$i] ) {
                    $mintid = $this->ti_sidste_tider[$i];
                    $minindex = $i;
                }
            }
            if ( $minindex < 10 ) { // indsæt denne istedet for den mindste
                $this->ti_sidste_tider[$minindex] = $tid;
                $this->ti_sidste_filer[$minindex] = $fil;
            }
        }
    } // end function sift( string )

} // endclass Find_ti

function traverse( $mappesti ) {
    global $kq;                // funktionen må ikke kaldes før $kq er oprettet
    $dirptr = opendir( $mappesti );
    while (($file = readdir($dirptr)) !== false) {
        if ( is_dir($mappesti."/".$file) {  // er det en undermappe ?
            traverse( $mappesti."/".$file );
        } else
        if ( substr( $file, strlen($file)-4 ) == ".dat" ) {  // er det en .dat fil
            $kq->sift( $mappesti."/".$file );
        } else {
            // alt andet end undermapper og .dat filer ignorerer vi bare
        }
    }
} // end function traverse( string )

$bundmappe = "/images";  // din grundmappe i strukturen. indskriv selv korrekt mappesti.
$kq = new Find_ti();      // et objekt til at indsamle filerne i
traverse( $bundmappe );  // indsamler de 10 nyeste .dat filer.

for ( $i=0; $i<count($this->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $this->ti_sidste_filer[$i] );
    echo "<br>".$temp[ count($temp)-3 ];    // udskriv trediesidste linie.
}
// det skulle være det.

?>

mvh JakobA
Avatar billede jakoba Nybegynder
22. juni 2003 - 19:33 #7
Ups. Jeg glemte at lukke  $dirptr  igen:
    }
    closedir( $dirptr );    // luk mappen igen.
} // end function traverse( string )
Avatar billede Slettet bruger
22. juni 2003 - 21:50 #8
wow.. nice arbejde ! Jeg vil straks forsøge at gøre det...
Avatar billede Slettet bruger
22. juni 2003 - 21:56 #9
Der kommer en parse error på linje:

        if ( is_dir($mappesti."/".$file) {  // er det en undermappe ?

Grundet en unexpected "{"
Avatar billede Slettet bruger
22. juni 2003 - 21:57 #10
Btw: Du skriver i en comment at undermapper skal ignoreres... det skal de ikke.. men kan ikke finde stedet i koden...
Avatar billede jakoba Nybegynder
22. juni 2003 - 21:58 #11
det er fordi jeg kun har een ')' til de to '(' der er

        if ( is_dir($mappesti."/".$file) ) {  // er det en undermappe ?
Avatar billede jakoba Nybegynder
22. juni 2003 - 21:59 #12
det er nok denne kommentar:
            // alt andet end undermapper og .dat filer ignorerer vi bare
prøv at læse den en gang mere :-)
Avatar billede Slettet bruger
22. juni 2003 - 22:01 #13
Læse den engang mere? Hvad mener du ?

Jeg har btw ændret
        if ( substr( $file, strlen($file)-4 ) == ".dat" ) {  // er det en .dat fil

Til

if ( substr( $file, strlen($file)-8 ) == ".dat.php" ) {  // er det en .dat fil

Dette er korrekt, ikke?
Avatar billede Slettet bruger
22. juni 2003 - 22:03 #14
Orv.. så kom der ellers gang i den:

Warning: readdir(): supplied argument is not a valid Directory resource in /customers/drengenebynight.dk/drengenebynight.dk/httpd.www/codex_main_test.php on line 167

Linje 167 værende:

    while (($file = readdir($dirptr)) !== false) {

Jeg må lige endnu engang takke for at du gider bruge så meget tid på mit problem.. men jeg lærer virkelig af din hjælp..
Avatar billede Slettet bruger
22. juni 2003 - 22:04 #15
Nåå.. jeg kan heller ikke læse dine comments korrekt mere.. my bad.
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:04 #16
der et korrekt hvis de filer har navne a la:
  "filnr1.dat.php"
men umiddelbart tvivler jeg på det er det du ønsker. det er mere almindelig at nøjes med en  '.dat' extension på filer der indeholder data.

mvh JakobA
Avatar billede Slettet bruger
22. juni 2003 - 22:07 #17
Commentsystemet genererer filer der hedder ".dat.php" .. men jeg kan vel godt ændre det til at lave .dat filer istedet.. men kan jeg ikke bare ændre linjen som jeg har gjort her?
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:08 #18
den på linie 167 tyder på at du angiver en mappesti der ikke er korrekt. Hvordan ser koden ud lige nu?  og hvilken mappe ligger den i?
Avatar billede Slettet bruger
22. juni 2003 - 22:09 #19
Kender du ellers noget til ovenstående warning?

Jeg slog op under readdir() på php.net's dokumenttation, men kunne ikke finde noget om problemer med supplied arguments...
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:09 #20
Jo hvis filerne virkelig hedder .dat.php i enden er den ændring du lavede helt fin.
Avatar billede Slettet bruger
22. juni 2003 - 22:09 #21
Filen ligger i roden, og undermapperne ligger i /billeder og nedaf... så jeg angav mappen "/billeder"
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:11 #22
hvis kaldet til funktionen  opendir( $mappesti )  i linien ovenover går galt vil den fejl komme i linie 167
Avatar billede Slettet bruger
22. juni 2003 - 22:12 #23
Bliver $mappesti overhovedet defineret nogen steder?

Jeg laver jo kun stien i $bundmappe ...
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:13 #24
så mappen billeder ligger i samme mappe som filen med scriptet? hvis det passer bør der stå
  $mappesti = "./billeder";

bemærk der er kun eet punktum.
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:15 #25
det er denne linie der definerer hvad der kommer til at stå i parameteren $mappesti

$bundmappe = "/images";  // din grundmappe i strukturen. indskriv selv korrekt mappesti.
Avatar billede Slettet bruger
22. juni 2003 - 22:15 #26
Taler du om de tre steder i funktionen traverse hvor der står:
$mappesti."/".$file

Der skal ændres til $mappesti."/billeder".$file

?

Fordi $mappesti = "./sti";

Findes ikke nogen steder i koden..
Avatar billede Slettet bruger
22. juni 2003 - 22:16 #27
Ja det tænkte jeg nok...

og den linje er

$bundmappe = "/billeder";  // din grundmappe i strukturen. indskriv selv korrekt mappesti.

Hvilket burde være korrekt?
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:21 #28
$bundmappe = "./billeder";  // din grundmappe i strukturen. indskriv selv korrekt mappesti.
skulle være korrekt. (jeg har tilføjet det der punktum.

nej du skal IKKE ændre til $mappesti."/billeder".$file  Det ville gå totalt galt.

vi kalder funktionen traverse med $bundmappe som parameter
traverse( $bundmappe );
og det betyder at imens funktionen kører har $mappesti den værdi indeni funktionen.
Avatar billede Slettet bruger
22. juni 2003 - 22:23 #29
Tilføjer jeg det punktum looper den med fejl:

Warning: stat failed for ./billeder/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././. in /customers/drengenebynight.dk/drengenebynight.dk/httpd.www/codex_main_test.php on line 168

Kan mit webhotel måske nægte scriptet at liste filer i strukturen?
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:28 #30
Jep. men vi er på rette vej nu. det er mig der glemte at tage højde for at du måske bor på en windowsserver.

    while (($file = readdir($dirptr)) !== false) {
        if ( $file == "." || $file == ".." ) {  //  TILFØJET 3 linier her
            // ignorer windows's standardmapper
        } else
        if ( is_dir($mappesti."/".$file) {  // er det en undermappe ?

det er i begyndelsen af funktionen traverse.
Avatar billede Slettet bruger
22. juni 2003 - 22:31 #31
Ja, windows er jo ikke altid noget at råbe hurra for.

Der kom den gamle fejl med unexpected '{', men der tilføjede jeg så parantesen.

Nu bliver siden vist, men der bliver ikke vist noget text!
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:36 #32
Nåeja, jeg gentog den fejl i kopien. sorry.

prøv at kikke i browserens sourcekode. bliver der skrevet noget der der blot ikke bliver vist?

allenfals er det efterhånden på tide du viser hvordan dit php script ser ud NU, så vi ikke snakker forbi hinanden.
Avatar billede Slettet bruger
22. juni 2003 - 22:41 #33
<?php

class Find_ti {
    var $ti_sidste_filer;
    var $ti_sidste_tider;

    function Find_ti() {
        $this->ti_sidste_filer = array();
        $this->ti_sidste_tider = array();
    } // end constructor Find_ti( )

    function sift( $fil ) {
        $tid = filectime( $fil );
        if ( count( $this->ti_sidste_filer ) < 10 ) {  // endnu ikke fundet 10
            $this->ti_sidste_filer[] = $fil;
            $this->ti_sidste_tider[] = $tid;
        } else {                        // har allerede 10 så skrot den ældste
            $mintid = $tid;  // finder mindste tid ( mindst == ældst )
            $minindex = 11;  // og index hvor mindste tid ligger
            for ( $i=0; $i<10; $i++ ) {  // find mindste
                if ( $mintid > $this->ti_sidste_tider[$i] ) {
                    $mintid = $this->ti_sidste_tider[$i];
                    $minindex = $i;
                }
            }
            if ( $minindex < 10 ) { // indsæt denne istedet for den mindste
                $this->ti_sidste_tider[$minindex] = $tid;
                $this->ti_sidste_filer[$minindex] = $fil;
            }
        }
    } // end function sift( string )

} // endclass Find_ti

function traverse( $mappesti ) {
    global $kq;                // funktionen må ikke kaldes før $kq er oprettet
    $dirptr = opendir( $mappesti );
    while (($file = readdir($dirptr)) !== false) {
        if ( $file == "." || $file == ".." ) {  //  TILFØJET 3 linier her
            // ignorer windows's standardmapper
        } else
        if ( is_dir($mappesti."/".$file) ) {  // er det en undermappe ?

            traverse( $mappesti."/".$file );
        } else
        if ( substr( $file, strlen($file)-8 ) == ".dat.php" ) {  // er det en .dat fil
            $kq->sift( $mappesti."/".$file );
        } else {
            // alt andet end undermapper og .dat filer ignorerer vi bare
        }
    }
closedir( $dirptr );    // luk mappen igen.
} // end function traverse( string )

$bundmappe = "./billeder";  // din grundmappe i strukturen. indskriv selv korrekt mappesti.
$kq = new Find_ti();      // et objekt til at indsamle filerne i
traverse( $bundmappe );  // indsamler de 10 nyeste .dat filer.

for ( $i=0; $i<count($this->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $this->ti_sidste_filer[$i] );
    echo "<br>".$temp[ count($temp)-3 ];    // udskriv trediesidste linie.
}
?>

Der er ikke noget, der ikke bliver vist i sourcen...

Der hvor data skulle fremkomme, står der bare
<-- Fully Catched -->
Avatar billede jakoba Nybegynder
22. juni 2003 - 22:49 #34
det ser korrekt ud.
Den der linie '<-- fully cached -->' kan ikke komme fra scriptet. den må komme fra den kode du har føre eller efter.

Næe hov, det er igen mig. de steder der står  $this  i forløkken fornede skal der istedetfor stå  $kq

for ( $i=0; $i<count($kq->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $kq->ti_sidste_filer[$i] );
    echo "<br>".$temp[ count($temp)-3 ];    // udskriv trediesidste linie.
}

Det burde egentlig have givet en klar php-fejlmelding, men du har nok slået advarsler fra.

det er de to første linier i for løkken der er rettet i.
Avatar billede Slettet bruger
22. juni 2003 - 22:54 #35
Ah ! Det lader til at virke.

Hvordan slår jeg fejlmeddelelser på så?

Så har jeg kun en sidste bøn til dig.. hvordan fjerner man de første 26 tegn i hver linje, og de sidste 2
En linje starter nemlig sådan her:
$archive_text[ $index] = "text text";

Men det er jo kun "text text" jeg skal bruge...

Og hvis jeg kunne lave hver linje til et link, til den side hvor det kommer fra?

Jeg har en parameter, i commentsystemet der hedder $relativeScriptPath der er = den url hvor commenten er lavet på, men ved ikke om den kan bruges her, uden for comment-scriptet.
Avatar billede Slettet bruger
22. juni 2003 - 22:57 #36
Ah .. nogle steder er linjerne rykket lidt, så det er 4-sidste og ikke 3-sidste.

Kan den finde nederste linje der starter med $archive_text[ $index] i stedet for?
Avatar billede Slettet bruger
22. juni 2003 - 22:59 #37
..og endnu en ting når vi er igang med debuggigen!

Det nyeste indlæg vises på 2. linje.. den 1 linje vedbliver det samme indlæg...
Avatar billede Slettet bruger
22. juni 2003 - 23:00 #38
Avatar billede jakoba Nybegynder
22. juni 2003 - 23:17 #39
du tage en underdel af en linie med funktionen substr http://dk2.php.net/substr
fx
    echo substr( $temp[count($temp)-3], 26, strlen($temp[count($temp)-3]) -26 -3 );
det skulle fjerne de første 26 tegn og de sidste 2 (der er et linieskift allersidst)

hvis der også skal søges efter linien bliver det lidt mere besværligt:

for ( $i=0; $i<count($kq->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $kq->ti_sidste_filer[$i] );

    $j = count($temp)-3;    // index for 3diesidste linie
    if ( strpos( $temp[$j], "\$archive_text[ \$index]" ) !== 0 ) { // hvis det ikke er den
        $j--;          // så brug den 4desidste istedetfor
    }
    echo "<br>".substring( $temp[$j], 26, strlen($temp[$j]) -26-3 );    // udskriv midten af tredie/fjerde sidste linie.
}

check efter om det du er den rigtige linie der udskrives. jeg er ikke helt sikker på det kald af strpos funktionen

an sidste. Ja det er korrekt. de 10 filer er ikke sorteret på nogen måde.
Avatar billede jakoba Nybegynder
22. juni 2003 - 23:21 #40
...
PATTER!!!
test
Ingen dato -
...
noen rimeligt klamme kommentarer :-))
Avatar billede Slettet bruger
22. juni 2003 - 23:29 #41
Hvor skal det så indsættest helt præcist?

Når folk skriver lange kommentare, kan den hoppe endnu flere linjer op, så det ville være smartest at den kunne udskrive den sidste linje i filen, der starter med $archive_text[ $index]

Ja, kommentarerne varrierer en smule i intelligensnivaeu .. :)
Avatar billede Slettet bruger
22. juni 2003 - 23:31 #42
Se evt. linket.. den laver ikke linjeskift..
Avatar billede jakoba Nybegynder
22. juni 2003 - 23:39 #43
der er for-løkken forneden der er blevet nogen linier større.
du kan udskifte if med while så den finder 5'tesidste, 6'tesidste, oswv linie om nødvendigt.

for ( $i=0; $i<count($kq->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $kq->ti_sidste_filer[$i] );
    $j = count($temp)-3;    // index for 3diesidste linie
        // ændret til while i næste linie
    while ( $j>0 && strpos( $temp[$j], "\$archive_text[ \$index]" ) !== 0 ) { // hvis det ikke er den
        $j--;          // så prøv den ovenover istedetfor
    }
    echo "<br>".substring( $temp[$j], 26, strlen($temp[$j]) -26-3 );
        // udskriv midten af tredie/fjerde/femmte/... -sidste linie.
}

det der <br> forrest i echo linien skulle søreme sørge for at der kommer et linieskift der.
Avatar billede Slettet bruger
22. juni 2003 - 23:41 #44
Fatal error: Call to undefined function: substring() in /customers/drengenebynight.dk/drengenebynight.dk/httpd.www/codex_main_test.php on line 195

lol :P
Avatar billede jakoba Nybegynder
22. juni 2003 - 23:42 #45
i din source står der:

"hun er fandme klam"ok
<br>"jaja - fuck dig!! stop nu bare med de der lorte-mails.. det er ik engang sjovt, bare stalker agtigt... og er det dig, der har skrevet det der pis om mig på alkoholdet.com???"lol - det billede kan jeg bare ikke huske jeg tog..."PATTER!!!"test"Ingen dato - autogenereret post"overvej hvor meget makeup pigen har på!"4th March 2003 - 12:00:00 PM"nej hun har ikke et navn desværre :o)               

der bliver kun skrevet <br> een eneste gang.
Avatar billede Slettet bruger
22. juni 2003 - 23:43 #46
Men det <br> er jo forkert.. det sku være mellem "hun er fandme klam" og "ok"
Avatar billede jakoba Nybegynder
22. juni 2003 - 23:55 #47
Ups:  substring  skal blot være  substr  (jeg roder javascript ind i det)

<br> skulle være foran hver eneste udskrevet streng. det er den ikke. men hvorfor har jeg ingen anelse om. check evt dine data.
Avatar billede Slettet bruger
23. juni 2003 - 00:31 #48
Så langt så godt, nu laver den ti fine <BR> men ingen tekst.. :P
Avatar billede jakoba Nybegynder
23. juni 2003 - 06:22 #49
det lyder somom den strpos test jeg laver ikke virker.
Check i dine .dat.php filer, er det korrekt at første linie i de filer er en lille kort linie?

prøv evt med blot:

for ( $i=0; $i<count($kq->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $kq->ti_sidste_filer[$i] );
    $j = count($temp)-3;    // index for 3diesidste linie
        // ændret til while i næste linie
    while ( $j>0 && strpos( $temp[$j], "archive_text[" ) === false ) { // hvis det ikke er den
        $j--;          // så prøv den ovenover istedetfor
    }
    echo "<br>".substring( $temp[$j], 26, strlen($temp[$j]) -26-2 );
        // udskriv midten af tredie/fjerde/femmte/... -sidste linie.
}
Avatar billede Slettet bruger
23. juni 2003 - 12:06 #50
Tjek siden.. den virker næsten.

Den viser dog kun 8 linjer, og laver et lidt sjovt break ved sitationstegnene i starten, men ellers er det nogenlunde på plads.

Havde du nogen idé om det med at lave linjerne til et link, til den side de bliver hentet fra?

Hvis det kan hjælpe, er urlen til de sider der postes i, den samme som .dat.php filen, bare uden .dat.
Avatar billede jakoba Nybegynder
23. juni 2003 - 12:32 #51
Det hjælper altid at få at vide hvad det er der slal linkes til når der skal laves et link. Så ja det er en hjælp. :-))

men jeg er lidt træt nu. Så det må en anden klare. (eller du selv:)

mvh JakobA
Avatar billede Slettet bruger
23. juni 2003 - 12:40 #52
Din hjælp har også været exceptionel. Jeg takker :)
Avatar billede Slettet bruger
24. juni 2003 - 17:37 #53
Hm.. nu viser den pludselig 10 <br> igen...

Forhelvede!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester