XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Sortierung Dateinamen (http://xhtmlforum.de/showthread.php?t=59486)

uspri 11.12.2009 11:46

Sortierung Dateinamen
 
Hallo,

ich lese mittels glob() einen Ordner bzw. die darin enthaltenen Bilder aus. Nun haben die Dateinamen mit einer Zahl hinten drann. Unter Windows schaut das nun so aus:

file_1.jpg
file_10.jpg
file_11.jpg
file_12.jpg
file_13.jpg
file_2.jpg
file_20.jpg
file_21.jpg

Wie kann ich das in eine sinnvolle Reihenfolge sortieren, also das nach file_1 auch file_2 kommt? sort() mit den vorhandenen Optionen bringt leider garnichts.

mantiz 11.12.2009 11:54

Auf die schnelle fällt mir nur ein, dass Du einmal durch alle Dateinamen durchläufst, wobei Du in einem Array die Dateinamen speicherst und in einem Array die Zahlen, die nach dem '_' kommen.

Anschließend kannst Du dann das Array mit den Dateinamen mit Hilfe des Arrays, wo die Zahlen drin stehen sortieren, mittels: PHP: array_multisort - Manual

protonenbeschleuniger 11.12.2009 12:28

Du meinst so:
Code:

#!/usr/bin/perl -w
use strict;

my @arr = <DATA>;

print map { $_->[0]} sort {$a->[1] <=> $b->[1] } map {[$_, /.*_(\d*)\./]} @arr;
 
__DATA__
file_1.jpg
file_10.jpg
file_11.jpg
file_12.jpg
file_13.jpg
file_2.jpg
file_20.jpg
file_21.jpg

Das ist eine Schwartz'sche Transformation

Scheppertreiber 11.12.2009 12:32

In C wäre das relativ einfach:

Code:

qsort( files, anzahl_elemente, grpesse_eines_elements, vergleich);

...

  vergleich(
  char *A,
  char *B
  )
{
  a = atoi( A + 5);
  b = atoi( B + 5);
  if  ( a == b)
    return 0;
  return a<b ? -1 : 1;
}

Halt einfach die Zahlenwerte vergleiche. So etwas sollte es in PHP aber auch geben ;)

inta 11.12.2009 12:41

PHP? Schau dir mal natsort() an.

mantiz 11.12.2009 12:42

Was ich immer wieder vergesse: Es gibt auch noch die Funktion PHP: usort - Manual, wo man eine benutzerdefinierte Vergleichsfunktion angeben kann, diese müsste dann nur entsprechend die Zahlen aus dem Dateinamen extrahieren und vergleichen.

// Edit: natsort() ist natürlich besser. :)

uspri 11.12.2009 12:58

natsort() ist genau das, was ich gesucht habe. Danke Euch, nun passt auch die Reihenfolge...

protonenbeschleuniger 11.12.2009 13:06

Es ging also um PHP, muss man ja auch Wissen

Scheppertreiber 11.12.2009 13:11

natsort() könnte man so machen:

Code:

  vergleich(
  char *A,
  char *B
  )
{
  char *ap, *bp;

  for ( ap=A; *ap && ! isdigit(*ap); ap++);
  for ( bp=B; *bp && ! isdigit(*bp); bp++);

  a = atoi( ap);
  b = atoi( bp);
  if  ( a == b)
    return 0;
  return a<b ? -1 : 1;
}

... ungetestet :mrgreen:

uspri 11.12.2009 18:31

Sicher könnte man das so machen, wenn man diese Sprache verwenden würde :lol:


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:04 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023