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?


$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 ++;
}
Probeer dit eens

<?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)
Je kunt dit heel leuk vergelijken met usort en een eigen vergelijkingsfunctie
<?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
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:
[php]for ($i=0; $file=$files[$i]; $i++)for ($i=0; $file=$files[$i]; $i++)[/php]

Enig idee waar dat aan ligt?
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)
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

<?php
for ($i=0; $i<count($files); $i++) {
$file=$files[$i];
?>
Top. Werkt perfect!

Bedankt voor de goede hulp.

Reageren