Avatar billede Slettet bruger
11. juli 2003 - 20:23 Der er 35 kommentarer og
1 løsning

Fjerne 4 tegn fra et filnavn.

Hej eksperter.

Den følgende kode finder de ti sidst redigerede filer, og echo'er noget af indholdet fra de ti filer.

Hvordan laver man en variabel, der tager filnavnet på de fundne filer og fjerner tegnene ".dat"?

Koden (© jakoba):
<?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($kq->ti_sidste_filer); $i++ ) { // for hver fil vi fandt
    $temp = file( $kq->ti_sidste_filer[$i] );
    $j = count($temp)-2;    // 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>"."<a href=\"ok\">".substr( $temp[$j], 26, strlen($temp[$j]) -26-2 )."</a>";
        // udskriv midten af tredie/fjerde/femmte/... -sidste linie.
}
?>
Avatar billede 2-maz Nybegynder
11. juli 2003 - 20:51 #1
$filer = implode(",", $kg->ti_sidste_filer);
$udendat = str_replace(".dat", "", $filer);
$out = explode(",", $udendat);
Avatar billede Slettet bruger
11. juli 2003 - 20:53 #2
Fejlmsg: Warning: Bad arguments to implode()

Jeg vil smide variablen ind i "<a href=" ">" .. hvordan gøres det helt præcist? Jeg får problemer med situationstegn..
Avatar billede Slettet bruger
11. juli 2003 - 20:54 #3
Jeg smider koden ind over det echo i bunden af koden...
Avatar billede 2-maz Nybegynder
11. juli 2003 - 20:59 #4
$filer = array();
for ( $i=0; $i<count($kq->ti_sidste_filer); $i++ ) {
$fil = str_replace(".dat", "", $kq->ti_sidste_filer[$i]);
$filer[] = "<a href=\"".$fil."\">";
}
så burde du få de filer ud i arrayet $filer...
Avatar billede Slettet bruger
11. juli 2003 - 21:04 #5
Det virkede faktisk, udover den nu ikke viser de ti nyeste, men kun den første... kan ikke gennemskue om den løkke overskriver noget andet...
Avatar billede Slettet bruger
11. juli 2003 - 21:10 #6
Ah , mig der ikke fattede.. det fungerer!
Avatar billede Slettet bruger
11. juli 2003 - 21:11 #7
Smid lige et svar...
Avatar billede Slettet bruger
11. juli 2003 - 21:24 #8
Linjen:
while ( $j>0 && strpos( $temp[$j], "archive_text[" ) === false ) { // hvis det ikke er den

Ville jeg meget gerne have til at være :
while ( $j>0 && strpos( $temp[$j], "archive_text[" ) === false ) || strpos( $temp[$j], "$archive_text[  $index] = "blablabla!";" ) === true )  { // hvis det ikke er den

Men "compileren" fejler, og siger: Parse error: parse error, unexpected T_BOOLEAN_OR

Men kan ikke forstå hvorfor det er forkert? Fordi det er jo en OR boolean jeg skal bruge?

Strengen skal frasorteres hvis ententen den ene, eller den anden kriterie er opfyldt..
Avatar billede detox Nybegynder
11. juli 2003 - 21:45 #9
Prøv at tælle dine paranteser og måske du osse skal kigge på den her streng: "blablabla!";" (evt.: "blablabla!\"\;")
Avatar billede 2-maz Nybegynder
11. juli 2003 - 21:46 #10
while ( $j>0 && strpos( $temp[$j], "archive_text[" ) === false || strpos( $temp[$j], "$archive_text[  $index] = "blablabla!";" ) === true )  {
?>
Avatar billede Slettet bruger
11. juli 2003 - 21:50 #11
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
Avatar billede Slettet bruger
11. juli 2003 - 21:53 #12
detox > Prøvede også at rette på situationstegnene, men uden resultat...
Avatar billede Slettet bruger
11. juli 2003 - 22:03 #13
Oh.. det var fordi jeg havde mellemrum i "blablabla" > "bla bla bla"
Avatar billede Slettet bruger
11. juli 2003 - 22:09 #14
Findes der så et wildcard for mellemrum, eller noget?
Avatar billede Slettet bruger
11. juli 2003 - 22:18 #15
Typiskt.. jeg skrev "blablabla" fordi jeg ikke gad skrive den rigtige sætning, men den indeholder mellemrum.. og det må den åbenbart ikke.. hvad gør man så?
Avatar billede detox Nybegynder
11. juli 2003 - 22:20 #16
Mellemrum skulle være ok, men hele strengen bør se sådan her ud:
"\$archive_text[  \$index] = \"blablabla!\"\;" hvis den skal fortolkes som du har skrevet.
Avatar billede detox Nybegynder
11. juli 2003 - 22:21 #17
Eller med mellemrum:
"\$archive_text[  \$index] = \"bla bla bla!\"\;"
Avatar billede Slettet bruger
11. juli 2003 - 22:22 #18
Sætter jeg det ind i '' istedet for "" kommer den ikke med fejl, men udelader ikke filerne som den burde...
Avatar billede detox Nybegynder
11. juli 2003 - 22:22 #19
Sorry en lille fejl:
"\$archive_text[  \$index] = \"bla bla bla!\";"
Avatar billede Slettet bruger
11. juli 2003 - 22:23 #20
detox > Dvs backslash bagved alt med tegn..?
Avatar billede detox Nybegynder
11. juli 2003 - 22:25 #21
I hvert fald ved $ og "
men åbenbart ikke ved ; som jeg troede.
Avatar billede Slettet bruger
11. juli 2003 - 22:25 #22
Det kan ikke passe... fordi strengen indeholder også ";" ..

Hele strengen som den skal lede efter, er :

$archive_text[  $index] = "sætning med mellemrum";

Ikke kun "sætning med mellemrum"
Avatar billede detox Nybegynder
11. juli 2003 - 22:25 #23
eller rettere foran ;-)
Avatar billede detox Nybegynder
11. juli 2003 - 22:26 #24
"\$archive_text[  \$index] = \"bla bla bla!\";"
tager osse ; med
Avatar billede detox Nybegynder
11. juli 2003 - 22:28 #25
echo "\$archive_text[  \$index] = \"bla bla bla!\";";
giver:
$archive_text[ $index] = "bla bla bla!";
Avatar billede Slettet bruger
11. juli 2003 - 22:31 #26
Det er virkelig underligt, fordi det virker ikke som det skal.. strenge der indeholder "bla bla bla" blive stadig vist!
Avatar billede Slettet bruger
11. juli 2003 - 22:34 #27
Dvs strenge der indeholder "$archive_text[  $index] = "bla bla bla";"

.. bliver vist..
Avatar billede detox Nybegynder
11. juli 2003 - 22:42 #28
Ja, så vidt jeg lige kan gennemskue din funktion er den faktisk selvmodsigende.
I det du først har:
"archive_text[" ) === false
og derefter:
"$archive_text[  $index] = "blablabla!";" ) === true
så hvis den anden er true ville den første jo osse være det.
Avatar billede Slettet bruger
11. juli 2003 - 22:45 #29
Doh, det kan da egentlig godt være... hvad gør man så? Deler den i to?
Avatar billede Slettet bruger
11. juli 2003 - 22:48 #30
Nåja.. den while sætning siger jo, at hvis archive_text[ IKKE er der, skal den springe den over..

Er det så bare at lave en nedenunder der siger, at hvis så $archive_text[  $index] = "blablabla!";" ER der, skal den også gå videre...?
Avatar billede detox Nybegynder
11. juli 2003 - 22:48 #31
Kan du ikke bare nøjes med: "$archive_text[  $index] = "blablabla!";" ) === true?
Avatar billede Slettet bruger
11. juli 2003 - 22:49 #32
Men.. så synes jeg egentlig stadig min sætning burde virke.. den siger hvis archive_text[ er falsk, ELLER hvis $archive_text[  $index] = "blablabla!";" er SAND, så skal den hoppe videre...
Avatar billede Slettet bruger
11. juli 2003 - 22:50 #33
Nej, fordi i de forskellige filer, står der andre ting end lige bla bla bla... men der står også andre ting end lige archive_text[ .. dvs at den skal tage linjen med archive_text[ hvergang, men når linjen så yderligere indeholder blablabla, skal den gå videre...

Hm.. men måske er jeg helt på forkert spor, fordi i den while sætning leder den jo i en fil den har fundet.. og den fil skal jo så helt kasseres...

Det er måske en totalt blindgyde..
Avatar billede detox Nybegynder
11. juli 2003 - 22:54 #34
He he, den er da lidt kringlet ;o)
Avatar billede Slettet bruger
11. juli 2003 - 22:55 #35
Der skal nok laves en helt ny funktion, eller tilskrives nogle linjer deroppe i koden hvor filerne findes...

Men det er jeg så ikke helt sikker på hvordan skal gøres...
Avatar billede detox Nybegynder
11. juli 2003 - 23:03 #36
Jeg er ikke helt med på hvad det går ud på, men det er da nærliggende at inkludere det i din klasse, hvis det er nogle filer du alligevel skal slette.
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