Avatar billede fixbabe Nybegynder
27. august 2006 - 21:33 Der er 19 kommentarer og
1 løsning

Liste filer med substr()

Jeg har oprettet et spm på http://www.eksperten.dk/spm/728244 dog var der en der mente jeg havde formuleret mig forkert så jeg prøver igen.

Fil nr 1: alm_Cup_zarkorammer_4471-0608030319-ak-47_map.dem.zip
Ud fra filens navn kan man se den er oprettet den 030806 kl 19.03 bane: ak-47_map.

Fil nr 2: rec_martinmarcusserver_4424-0608171511-de_dust2.dem.zip
Ud fra filens navn kan man se den er oprettet den 170806 kl 11.15 bane: de_dust2.

Filerne ligger i mappen /server/www/site/demo

Det jeg ønsker er et script der lister filerne efter dato og klokke slet, altså et script der henter tingene ud fra filnavnet dog uden _

noget ala dette

17/07/06
-land – demonavn – klokken – port
-land – demonavn – klokken – port

16/07/06
-land – demonavn – klokken – port

14/07/06
-land – demonavn – klokken – port
-land – demonavn – klokken - port

Fil navnene er opbygget på denne måde:
da_carlo_4154-0608271311-de_inferno.dem

da - Land
carlo - demo navn
4154 - Port
0608271311 - dato og klokken
de_inferno - map

Jeg vil gerne have udskrevet de fem ting som variabler ($land, $navn, $port, $dato, $klokken, $map)

Den der kan løse denne opgave får også de 60 points fra det andet spm, jeg er villig til at give mere end de 200 point for et svar der kan hjælpe.

Jeg håber dette er en grundig nok forklaring :)
Avatar billede nielle Nybegynder
27. august 2006 - 22:03 #1
List filerne fra dit biobliotek på den sædvanlige måde.

Læg filnavnene i et array undervejs.

Brug usort() til at sortere dette array som du øsnker det.

usort: http://dk.php.net/usort

Brug substr() til at udtrække de forskellige oplysninger fra filnavnene:

substr: http://dk.php.net/substr
Avatar billede coderdk Praktikant
27. august 2006 - 22:10 #2
Kan gøres sådan :)

    $filer = glob( "/server/www/site/demo/*.dem.zip" );
    $result = array();
    foreach ( $filer as $fil )
    {
        $fil = basename( $fil );
        if ( preg_match( "/^(.+?)_(.+?)_(\d+)-(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-(.*?)\.dem\.zip/i", $fil, $m) )
        {
            $ts = mktime( $m[8], $m[7], 0, $m[5], $m[6], $m[4] );
            $land = $m[1];
            $name = $m[2];
            $port = $m[3];
            $map = $m[9];
            $date = date( "Ymd", $ts );
            $tid = date( "H:i", $ts );
            $result[$ts] = array(
                    "land" => $land
                    ,"name" => $name
                    ,"port" => $port
                    ,"map" => $map
                );
        }
    }
   
    ksort( $result );

    $olddate = "";
    foreach ( $result as $ts => $row )
    {
        $date = date( "Ymd", $ts );
        if ( $olddate != $date )
        {
            echo "<br>" . date("d/m/y") . "<br>";
            $olddate = $date;
        }
        $tid = date( "H:i", $ts );
        echo "-$row[land] - $row[name] - $tid - $row[port]<br>";       
    }
Avatar billede fixbabe Nybegynder
27. august 2006 - 22:11 #3
Nu er jeg ikke den store haj til php som du nok har bemærket :)  derfor jeg søger en der kan lave det. jeg ved ikke engang hvordan jeg laver et array. beklager
Avatar billede coderdk Praktikant
27. august 2006 - 22:11 #4
Disse to linjer i den første foreach bliver ikke brugt, og kan slettes:

            $date = date( "Ymd", $ts );
            $tid = date( "H:i", $ts );
Avatar billede coderdk Praktikant
27. august 2006 - 22:13 #5
ksort( $result );

skal nok være:

krsort( $result );

og

            echo "<br>" . date("d/m/y") . "<br>";

skal nok være:

            echo "<br>" . date( "d/m/y", $ts ) . "<br>";
Avatar billede coderdk Praktikant
27. august 2006 - 22:14 #6
Så den "færdige kode" bliver:

    $filer = glob( "/server/www/site/demo/*.dem.zip" );
    $result = array();
    foreach ( $filer as $fil )
    {
        $fil = basename( $fil );
        if ( preg_match( "/^(.+?)_(.+?)_(\d+)-(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-(.*?)\.dem\.zip/i", $fil, $m) )
        {
            $ts = mktime( $m[8], $m[7], 0, $m[5], $m[6], $m[4] );
            $land = $m[1];
            $name = $m[2];
            $port = $m[3];
            $map = $m[9];
            $result[$ts] = array(
                    "land" => $land
                    ,"name" => $name
                    ,"port" => $port
                    ,"map" => $map
                );
        }
    }
   
    ksort( $result );

    $olddate = "";
    foreach ( $result as $ts => $row )
    {
        $date = date( "Ymd", $ts );
        if ( $olddate != $date )
        {
            echo "<br>" . date( "d/m/y", $ts ) . "<br>";
            $olddate = $date;
        }
        $tid = date( "H:i", $ts );
        echo "-$row[land] - $row[name] - $tid - $row[port]<br>";       
    }
Avatar billede coderdk Praktikant
27. august 2006 - 22:14 #7
Klart jeg glemmer at ændre ksort til krsort ;P
Avatar billede fixbabe Nybegynder
27. august 2006 - 22:24 #8
<3 Du gør det gang på gang når jeg har brug for hjælp, det er helt utroligt.

Endnu engang skulle jeg til at tro at jeg skulle opgive endnu et projekt men ak nej du reder mig igen :)

Det virker som ønsket og bedre kan det ikke blive, så hvis du gider svare her og på http://www.eksperten.dk/spm/728244 så jeg kan lukke.
Avatar billede fixbabe Nybegynder
27. august 2006 - 22:36 #9
Det eneste jeg mangler et en mulighed for at linke til filen, jeg prøvede med $fil men så linker alle til den samme :)
Avatar billede coderdk Praktikant
27. august 2006 - 23:05 #10
Lav den første foreach om til:

    $filer = glob( "/server/www/site/demo/*.dem.zip" );
    $result = array();
    foreach ( $filer as $fil )
    {
        $fil = basename( $fil );
        if ( preg_match( "/^(.+?)_(.+?)_(\d+)-(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-(.*?)\.dem\.zip/i", $fil, $m) )
        {
            $ts = mktime( $m[8], $m[7], 0, $m[5], $m[6], $m[4] );
            $land = $m[1];
            $name = $m[2];
            $port = $m[3];
            $map = $m[9];
            $result[$ts] = array(
                    "land" => $land
                    ,"name" => $name
                    ,"port" => $port
                    ,"map" => $map
                    ,"fil" => $fil
                );
        }
    }
 
    krsort( $result );

    $olddate = "";
    foreach ( $result as $ts => $row )
    {
        $date = date( "Ymd", $ts );
        if ( $olddate != $date )
        {
            echo "<br>" . date( "d/m/y", $ts ) . "<br>";
            $olddate = $date;
        }
        $tid = date( "H:i", $ts );
        echo "-<a href='$row[fil]'>$row[land] - $row[name] - $tid - $row[port]</a><br>";     
    }

:)
Avatar billede coderdk Praktikant
27. august 2006 - 23:05 #11
"Lav den første foreach om til:" var forkert, jeg har bare listet hele den nye kode ;P
Avatar billede fixbabe Nybegynder
27. august 2006 - 23:05 #12
Har løst det problem.
Avatar billede fixbabe Nybegynder
27. august 2006 - 23:07 #13
hvor er jeg dårlig til at svare her inde.. glemte at poste hvordan:

            $land = $m[1];
            $name = $m[2];
            $port = $m[3];
            $map = $m[9];
        $link = $m[0];

            $result[$ts] = array(
                    "land" => $land
                    ,"name" => $name
                    ,"port" => $port
                    ,"map" => $map
              ,"link" => $link
                );

Hvordan gør jeg så den lister filerne efter klokken?
Avatar billede coderdk Praktikant
27. august 2006 - 23:23 #14
Gør den ikke det?
Avatar billede fixbabe Nybegynder
27. august 2006 - 23:35 #15
Nej jeg fandt en lille fejl $tid = date( "H:i", $ts ); skulle være $tid = date( "i:H", $ts ); da der var byttet om på dem
Avatar billede fixbabe Nybegynder
27. august 2006 - 23:42 #16
Har fundet et par andre små fejl, ved ikke om de kan skyltes at jeg har ændret i scriptet. (men er nok derfor)

http://www.bookhltv.dk/tester.php?mod=cstrike

<?php
if (isset($_GET['mod']) && $_GET['get']) {

if (file_exists('demo/'.$_GET['mod'].'/'.$_GET['get'])) {

$info = 'demo/'.$_GET['mod'].'/'.$_GET['get'].'';
}
//echo "<meta HTTP-EQUIV='REFRESH' target=_self CONTENT='1; URL=$info'>";

header("Location: $info");
}

include "inc_top.php";
print "<font size=2><b>Demo download</b></font><br>";

$mod = $_GET[mod];

if ($mod == ''){
echo "her kommer links til downloads";
}


//print '<div align="center">    <table border="0" width="90%" id="table1"><tr><td>';
    $filer = glob( "demo/$mod/*.dem.zip" );
    $result = array();
    foreach ( $filer as $fil )
    {
      $linkx = $fil;
    $fil = basename( $fil );
        if ( preg_match( "/^(.+?)_(.+?)_(\d+)-(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-(.*?)\.dem\.zip/i", $fil, $m) )
        {
            $ts = mktime( $m[8], $m[7], 0, $m[5], $m[6], $m[4] );
            $land = $m[1];
            $name = $m[2];
            $port = $m[3];
            $map = $m[9];
        $link = $m[0];

            $result[$ts] = array(
                    "land" => $land
                    ,"name" => $name
                    ,"port" => $port
                    ,"map" => $map
              ,"link" => $link
                );
        }
    }
   
    krsort( $result );

    $olddate = "";
    foreach ( $result as $ts => $row )
    {
        $date = date( "Ymd", $ts );
        if ( $olddate != $date )
        {   
    echo "<br><b><font size=1>" . date( "d/m/y", $ts ) . "</b><br>";
            $olddate = $date;
        }
        $tid = date( "i:H", $ts );

echo '<div align="center"><center><table id="Table_01" width="380" height="40" border="0" cellpadding="0" cellspacing="0"><tr><td background="images/book_hltv_demo_list_01.gif" width="49" height="50" align="center"><img border="0" src="images/zip.gif"></td>';
echo "<td background=images/book_hltv_demo_list_02.gif width=331 height=50 align=left><font size=1><a href=?mod=$mod&get=$row[link] style='text-decoration: none'><font color=#000000>[FLAG] <b>$row[name]</b> <br> Time: $tid Port: $row[port] Map: $row[map]</a></td>";
echo '</tr><tr><td width="380" height="6" align="center" colspan="2"></td></tr></table></center></div>';


//echo "<font size=1><a href=?mod=$mod&get=$row[link] style='text-decoration: none'><font color=#000000>[FLAG] $tid - $row[name] <br> Port: $row[port] Map: $row[map]</a><br>";       
    }
//print '</td></tr></table></div>';
include "inc_bund.php";
?>
Avatar billede fixbabe Nybegynder
27. august 2006 - 23:45 #17
ah men igen gør jeg det, poster uden at skrive fejlen..

tag eks den øverste fil på linket, filen heddder: game_dacup26_4097-0608270055-de_nuke.dem.zip men bliver listet under 29/08/06 selv om vi kun har den 27/08/06 :)

og i info står der Time: 00:07 Port: 4097 Map: de_nuke selvom der i filen står klokken 00,55
Avatar billede coderdk Praktikant
28. august 2006 - 00:03 #18
Mig der har sovet i timen, det ER altså date( "H:i", $ts ) men denne mktime linjen var forkert:

            $ts = mktime( $m[7], $m[8], 0, $m[5], $m[6], $m[4] );

Sådan skal den se ud!
Avatar billede fixbabe Nybegynder
28. august 2006 - 06:26 #19
:) Perfekt, takker endnu en gang for din hjælp.
Avatar billede coderdk Praktikant
28. august 2006 - 11:00 #20
Velbekomme :)
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