shell exec — самый старый путь PHP, основанный на имени dir

У меня на моей машине Linux такая структура дерева папок:
/dir/yyyy/mm/dd/HH

например.:
/dir/2014/03/01/08
/dir/2014/03/20/09
/dir/2014/03/01/10
/dir/2014/08/01/10
/dir/2014/12/15/10
/dir/2015/01/01/14

Я хотел бы узнать в php, какой путь самый старый, например:
Самый старый путь это: 2014-03-01 08
Новейший путь: 2015-01-01 14

Как это можно сделать?

1

Решение

Можно было бы написать лучше, но это работает

 $paths = array(
'/dir/2014/03/01/08',
'/dir/2014/03/20/09',
'/dir/2014/03/01/10',
'/dir/2014/08/01/10',
'/dir/2014/12/15/10',
'/dir/2015/01/01/14',
);

$dates = array();

foreach($paths as $path)
{
$matches = array();
preg_match('#([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+)#', $path, $matches);
$dates[$path] = strtotime(sprintf("%s-%s-%s %s:00:00", $matches[2],      $matches[3], $matches[4], $matches[5]));
}

asort($dates);

$dates = array_keys($dates);
$oldest = array_shift($dates);
$newest = array_pop($dates);

Он изменяет дату поиска с помощью регулярного выражения на unixtimestamp, затем сортирует ее и возвращает верхнее и нижнее значение отсортированного массива.

0

Другие решения

Немного похоже на стиль Паскаля)

<?php

$oldest = '';
$newest = '';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./dir/'));
foreach ($iterator as $file => $object) {
if ($iterator->getDepth() === 4) {
$name = $object->getPath();
if ($name > $newest) {
$newest = $name;
}
if (empty($oldest) or $name < $oldest) {
$oldest = $name;
}
}
}
var_export([$oldest, $newest]);

Результат:

array (
0 => './dir/2014/03/01/08',
1 => './dir/2015/01/01/14',
)
0

Все, что вам нужно сделать, это перебрать каждую папку и найти каталог с наименьшим номером. Если у вас есть пути к файлам, хранящиеся в базе данных, это может быть проще, но из вашего вопроса кажется, что вы хотите искать папки.

<?php

$base = 'dir';
$yearLowest = lowestDir($base);
$monthLowest = lowestDir($yearLowest);
$dayLowest = lowestDir($monthLowest);

echo $dayLowest;

function lowestDir($dir) {
$lowest = null;
$handle = opendir($dir);

while(($name = readdir($handle))) {
if($name == '.' || $name == '..') {
continue;
}

if(is_dir($dir.'/'.$name) && ($lowest == null || $name < $lowest)) {
$lowest = $name;
}
}

closedir($handle);
return $dir.'/'.$lowest;
}

?>
0
По вопросам рекламы [email protected]