[php] sorteren op datum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
ik heb de volgende code geschreven:

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
$dir = "fotos/"; 
         
        if (is_dir($dir)) {
           if ($dh = opendir($dir)) {
               while (($file = readdir($dh)) !== false) {
                    if ($file == "." || $file == "..") continue;
                    $maand_array = array( 
                      "Januari", "Februari", "Maart", "April", 
                      "Mei", "Juni", "Juli", "Augustus", "September", 
                      "Oktober", "November", "December"); 
                    $dagen_array = array( 
                          "Zo", "Ma", "Di", "Wo", 
                          "Do", "Vr", "Za"); 

                    $dag2  = substr($file,0,2); 
                    $maand2 = substr($file,3,2); 
                    $jaar2   = substr($file,6,4);
                    $tekst2 = substr($file,11);
                    $rekendat2 = mktime(0, 0, 0, $maand2, $dag2, $jaar2);
                    rsort($rekendat2, SORT_NUMERIC); 
                    $datum2 = $dagen_array[date("w", $rekendat)] . date(" j ", $rekendat) . $maand_array[date("n ", $rekendat) - 1];
                    echo "<a href='agenda.php'>$datum2</a><br />$tekst2<br /><br />";
               }
               closedir($dh);
           }
        }


door middel van de rsort wil ik dus sorteren op datum in desc. Echter moeten die datums eerst in een array staan voordat ik ze kan sorteren, hoe kan ik in dit geval dit het beste oplossen?

Acties:
  • 0 Henk 'm!

Verwijderd

Steek je files in een associatief array, met de timestamp die je nu al berekent als key ($filesByDate). Doe dan ksort($filesByDate); en je files zijn gesorteerd. om ze er dan weer uit te halen kan je zoiets doen:

PHP:
1
2
3
4
5
ksort($filesByDate);

foreach($filesByDate as $date => $file) {
    echo date('d/m/Y',$date)," => ",$file,"\n";
}

Acties:
  • 0 Henk 'm!

Verwijderd

Vergeten te vermelden: als je meerdere files kunt hebben op dezelfde dag moet je collisions vermijden door subarrays te gebruiken. Je code ziet er dan zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
for(...) {
      ...
      $filesByDate[$timestamp][] = $file;
}

foreach($filesByDate as $date => $files) {
    foreach($files as $file) {
         echo date('d/m/Y',$date)," => ",$file,"\n";
    }
}

[ Voor 9% gewijzigd door Verwijderd op 20-11-2005 14:28 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

@bosmeeuw: je doet er beter aan een fatsoenlijk associatief array te maken met een numerieke index, welke een array als elementen bevat. Die kun je vervolgens sorteren met een eigen sortfunctie, middels usort.

@Stoney187: ben je op de hoogte van de functies strtotime, setlocale en eventueel strftime? Die kunnen je aardig wat werk uit handen nemen zo te zien. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 21-09 14:39

Johnny

ondergewaardeerde internetguru

Dagen en maanden beginnen in het Nederlands niet met een hoofdletter...

[ Voor 23% gewijzigd door Johnny op 20-11-2005 15:07 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
ik heb het nu zo:

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
        $dir = "fotos/"; 
         
        if (is_dir($dir)) {
           if ($dh = opendir($dir)) {
               while (($file = readdir($dh)) !== false) {
                    if ($file == "." || $file == "..") continue;
                    $maand_array = array( 
                      "Januari", "Februari", "Maart", "April", 
                      "Mei", "Juni", "Juli", "Augustus", "September", 
                      "Oktober", "November", "December"); 
                    $dagen_array = array( 
                          "Zo", "Ma", "Di", "Wo", 
                          "Do", "Vr", "Za"); 

                    $dag2  = substr($file,0,2); 
                    $maand2 = substr($file,3,2); 
                    $jaar2   = substr($file,6,4);
                    $tekst2 = substr($file,11);
                    $rekendat2 = mktime(0, 0, 0, $maand2, $dag2, $jaar2);
                    $filesByDate = array($rekendat2=>$tekst2); 
                    ksort($filesByDate);
                    foreach($filesByDate as $date => $file) { 
                        $datum2 = $dagen_array[date("w", $date)] . date(" j ", $date) . $maand_array[date("n ", $date) - 1]; 
                        echo "<a href='agenda.php'>",$datum2," </a><br /> ",$file,"<br /><br />\n"; 
                    } 
                    

               }
               closedir($dh);
           }
        }


dit lijkt al te werken maar wat NME al zegt wil ik ze graag andersom sorteren nu krijg ik ze netjes op datum maar ik wil graag in DESC

ik zeg er nu maar even bij dat ik niet echt gevorderd ben en al aardig lang bezig was de code van bosmeester uit te zoeken :Y)

[ Voor 21% gewijzigd door rewind. op 20-11-2005 15:18 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Omgekeerde volgorde is easy: array_reverse :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
array_reverse zorgt er in mij situatie voor dat alle datums verwijderd worden uit de array en ik verw8 dat ze vervangen worden door getallen [0] [1] [2] etc.. is hier een oplossing voor? op de php pagina hebben ze het hier ook over maar niet over een oplossing.

edit: de functies die nme mij eerder gaf maken me code idd een stuk korter :)

[ Voor 12% gewijzigd door rewind. op 21-11-2005 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Stoney187 schreef op maandag 21 november 2005 @ 14:44:
array_reverse zorgt er in mij situatie voor dat alle datums verwijderd worden uit de array en ik verw8 dat ze vervangen worden door getallen [0] [1] [2] etc.. is hier een oplossing voor? op de php pagina hebben ze het hier ook over maar niet over een oplossing.
Als je goed gekeken had dan zag je dat je aan array_reverse een extra argument mee kunt geven, waardoor de keys bewaard blijven ;)

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
dan zou de volgende code moeten werken maar er veranderd helemaal niks?

PHP:
1
2
3
4
5
6
7
$filesByDate = array($rekendat2=>$tekst2); 
ksort($filesByDate);
$filesByDate2 = array_reverse($filesByDate, true);
foreach($filesByDate2 as $date => $file) { 
  $datum2 = $dagen_array[date("w", $date)] . date(" j ", $date) . $maand_array[date("n ", $date) - 1]; 
  echo "<a href='agenda.php'>",$datum2," </a><br /> ",$file,"<br /><br />\n"; 
}

[ Voor 40% gewijzigd door rewind. op 21-11-2005 23:01 ]


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
subtiele kick

ik kom er net achter dat het hele sort gebeuren niet werkt. zodra ik een map toevoeg in een ander jaar of maand daar niet naar gekeken word.

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Je moet ook eerst je array vullen en daarna pas (dus na je closedir) je array sorteren.
Om de juiste volgorde te krijgen kun je natuurlijk krsort gebruiken ipv ksort.
Pagina: 1