[PHP] sorteren op lastmodified

Pagina: 1
Acties:
  • 233 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 28856

Topicstarter
Hallo,

Ik wil een directory uitlezen en vervolgens de lijst sorteren op lastmodified time. Daarvoor lijkt filemtime het meest geschikt.

Het onderstaande zelf aangepaste script dat ik gebruik werkte wel met 'rsort' maar bij maandovergangen ging dat dan mis omdat de filenamen deels bestaan uit een dagnummer (bv. pwhi0100.pdf, pwhi3000.pdf (waarbij in dit geval 30 slaat op de 30e v/d maand en 01 op de 1e v/d maand)).

Het werkende script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php 

$itemnr = 0; 
$productname = 'PWHI'; 
$listname = 'TEST'; 
$url_base = 'http://www.mijndomein.nl/data/printoutput/'; 
$slash = '/'; 
$url = $url_base.$productname.$slash; 
$form_linkname = $productname; 
$formname = 'form_'.$productname; 
$dir = opendir("/webdata/htdocs/data/printoutput/".$productname.$slash); 

function RemoveExtension($strName) 
{ 
$ext = strrchr($strName, '_'.$productname.'.'); 

if($ext !== false) 
{ 
$strName = substr($strName, 0, -strlen($ext)); 
} 
return $strName; 
} 

while (false !== ($file = readdir($dir))) 

{ 
if (($file !== ".") && ($file !== "..")) 
{ 
list($filename, $ext) = explode(".", $file); 
list($main, $sub, $include) = explode("/", $PHP_SELF); 
if ($ext <> "php") { 
$lijst[$itemnr] = RemoveExtension($file); 
$itemnr++; 
} 
} 
} 

rsort($lijst); 
print "<form class=form_index name=\"$formname\"> 
<select class=index name=$form_linkname onChange=parent.printoutput.location=document.$formname.$form_linkname.options[document.$formname.$form_linkname.selectedIndex].value>"; 
print "<option value=\printoutput.html>$listname</option>"; 
for($i=0;$i<sizeof($lijst);$i++) 
{ 
print "<option value=\"$url".$lijst[$i]."_".$productname.".".$ext."\">".$lijst[$i]."</option>"; 
} 
print '</select> 
</form>'; 
?> 


Vervolgens wil ik dus gaan sorteren door de lastmodified datum/tijd onderling te vergelijken en vond via google een script dat ik op het bovenstaande wilde toepassen, maar waar ik dus niet uitkom.......:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$dirpath = '../dunst/'; 
$dir = opendir($dirpath); 

while (false !== ($file = readdir($dir))) { 
$localpath = $dirpath.$file; 
if (is_file($localpath)) { 
$key = filemtime($localpath); 
$files_by_date[$key] = $file; 
$files_by_name[] = $file; 
} 
} 

ksort($files_by_date); 

foreach ($files_by_date as $file) echo $file.'<br />';

Wie kan/wil mij helpen! ;)


Groeten,
John

[ Voor 12% gewijzigd door crisp op 22-05-2006 08:40 ]


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 19:40

hamsteg

Species 5618

Misschien een domme vraag maar waarom niet de file-formatting standaard maken? Een of andere ISO standaard raadt het volgende aan (en dat sorteert heel makkelijk):

    yyyymmdd

exec( "ls -t (-r)", $OutputArray, $ReturnValue );

edit: wil je niet zo'n grote string wilt dan kun je de nummers omzetten in characters:
      A-Za-z = 54 opties
      voorbeeld: 20060522 (basis jaar wordt dan jaar 2005, voor de rest gewoon tellen)
      wordt: pwhiAEV.pdf
      Genereren van de filename is ietsje meer werk maar voor de rest ...

[ Voor 59% gewijzigd door hamsteg op 22-05-2006 08:44 ]


Acties:
  • 0 Henk 'm!

  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 06-06 07:26
misschien de mensen in Programming? Gebruik er wel meteen wat code-tags als je toch bezig bent ;)

Maar als het om bestanden gaat die aangepast worden, waarom dan niet simpelweg een (eventueel multidimensionaal) array waarin je de timestamp 'en bestandsnaam bijhoudt? Met filemtime() krijg je de modified-timestamp (eventueel zelf nog even formatten naar "yyyy-mm-dd-hh-mm-ss"), plak die voor de bestandsnaam en sorteer de array achteraf op alfabetische volgorde.

Je array bestaat dan uit entries als:
2006-03-26-12-12-23-filenaam1.php
2006-02-21-10-12-03-filenaam1.php
2006-01-27-02-42-43-filenaam1.php

simpelweg de eerste20 karakters wegschrappen en je hebt je originele bestandsnaam.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

--> Programming + gratis code-tags erbij ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:32

Creepy

Tactical Espionage Splatterer

En waar kom je dan niet uit? Wat lukt er niet? Krijg je foutmeldingen? etc? :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney