Mappen sorteren op datum laatst gewijzigd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marlon Veldman

Marlon Veldman

26/02/2011 20:06:51
Quote Anchor link
Ik ben lang op zoek geweest naar een script om mijn mappenlijst te sorteren op laatste wijzigingen (controle met filemtime). Dus de map die als laatste gewijzigd is, moet bovenaan komen. Hoe kan ik dat toepassen in onderstaand script?

Quote:
$dirinhoud = showdirs('../../images/');

$count_album = 0;

foreach($dirinhoud as $dir)
{
$no_show = array('_', '../../images/');
$dirshow = str_replace($no_show, ' ', $dir);
$getLastModDir = date ("d-m-y", filemtime($dir));

echo '
<div>' . $dirshow . '</div>
<div>' . $getLastModDir .'</div>
';

$count_album ++;
}
Gewijzigd op 26/02/2011 20:09:01 door Marlon Veldman
 
PHP hulp

PHP hulp

15/01/2025 00:04:55
 
Kris Peeters

Kris Peeters

03/03/2011 13:40:24
Quote Anchor link
Probeer dit eens

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
49
50
51
52
53
54
55
56
57
58
59
<?php
$dir
= 'images/';
$dirinhoud = getSubdirs($dir);
$sortedDirs = sortByFiletime($dirinhoud, $dir);

// controleren of alles goed zit
foreach ($sortedDirs as $item) {
  echo  $item .' - '. date ("Y-m-d H:i:s", filemtime($dir . $item)) .'<br/>';
}

function
sortByFiletime($dirs, $dir) {
    $result = array();
    // indien nodig een "/" toegoegen op het einde
    if (substr($dir, -1) != '/') {
        $dir .= '/';
    }

    // we vullen een tijdelijke array met enkel de file times
    $fileTimes = array();
    foreach($dirs as $key=>$item) {
        $fileTimes[] = date ("Y-m-d H:i:s", filemtime($dir . $item));
    }

    // we sorteren de tijdelijke array.  We krijgen niet de waarde (die tijd) terug, maar de key van de array
    $keys = getSortedKeys($fileTimes);
    foreach($dirs as $key=>$item) {
      // $key is: 0, 1, 2, ...
      // $keys is: een array van (de gesorteerde index naar tijd van $dirs)
      // [ $keys[$key] ] is: de juiste key voor $dir

      $result[] = $dirs[ $keys[$key] ];
    }

    return $result;
}

// geeft niet de items zelf terug, maar de key
function getSortedKeys($items) {
  $result = array();
  asort($items);
  foreach($items as $key=>$item) {
    $result[] = $key;
  }
  
  return $result;
}

function
getSubdirs ($dir) {
    $result = array();
    // indien nodig een "/" toegoegen op het einde
    if (substr($dir, -1) != '/') {
        $dir .= '/';
    }

    $files = scandir($dir);
    for ($i=0; $file=$files[$i]; $i++) {
        if ($file == '.' || $file == '..' ) {  // deze komen altijd voor, maar hebben we niet nodig
            continue;
        }

        if (is_dir($dir . $file)) {
            $result[] = $file;
        }
    }

    return $result;
}

?>


(ben ik toch wel even mee bezig geweest)
Gewijzigd op 03/03/2011 14:09:36 door Kris Peeters
 
TJVB tvb

TJVB tvb

03/03/2011 14:01:56
Quote Anchor link
Je kunt dit heel leuk vergelijken met usort en een eigen vergelijkingsfunctie
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
/**
 * function to get the directorys from a directory
 **/

function getDirs($dirname)
{

    if(substr($dirname,-1) != '/')
    {

        $dirname .= '/';
    }

    $dirs = array();
    if(is_dir($dirname))
    {

        foreach(scandir($dirname) AS $file)
        {

            if($file != '.' && $file != '..' && is_dir($dirname . $file))
            {

                $dirs[] = $dirname . $file;
            }
        }
    }

    return $dirs;
}


/**
 * compare the directory times
 **/

function compareDirTime($dirA, $dirB)
{

    $timeA = (int) filemtime($dirA);
    $timeB = (int) filemtime($dirB);
    return $timeA - $timeB;
}


echo '<pre>';
$dirs = getDirs('./dirtimedemo');
print_r($dirs);

usort($dirs, 'compareDirTime');
print_r($dirs);
echo '</pre>';
?>



Demo: http://phphulp.tjvb.nl/dirtimedemo.php
 
Marlon Veldman

Marlon Veldman

03/03/2011 14:16:24
Quote Anchor link
Kris, het werkt echt super! Hartstikke bedankt voor de moeite!

Ik krijg alleen één melding:
Notice: Undefined offset: 11 in /path.php on line 85.

Lijn 85 begint bij mij met:
for ($i=0; $file=$files[$i]; $i++)for ($i=0; $file=$files[$i]; $i++)

Enig idee waar dat aan ligt?
Gewijzigd op 03/03/2011 14:17:11 door Marlon Veldman
 
TJVB tvb

TJVB tvb

03/03/2011 14:18:48
Quote Anchor link
Die for loop controleert niet goed. Hij roept namelijk als laatste een niet bestaande waarde aan (dat is jouw foutmelding)
maak daar eens van:
foreach($files AS $file)
 
Kris Peeters

Kris Peeters

03/03/2011 14:22:49
Quote Anchor link
Ja, dat zal gebeuren bij de laatste iteratie.
Ik zet notice's meestal af.

Okay, vervang die for (bij mijn post: lijn 49) dan door

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
for ($i=0; $i<count($files); $i++) {
  $file=$files[$i];
?>
 
Marlon Veldman

Marlon Veldman

03/03/2011 14:23:58
Quote Anchor link
Top. Werkt perfect!

Bedankt voor de goede hulp.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.