2015-03-27 5 views
1

У меня на 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/14PHP самый старый путь на основе имени дир

Я хотел бы получить в PHP, какой путь является самым старым, как это:
Самый старый путь: 2014-03-01 08
Последний путь: 2015-01-01 14

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

+2

самый быстрый? множество ответов слишком велико. вам нужно будет сравнить каждый возможный ответ, чтобы сказать, что самое быстрое – Ghost

+0

ok, изменил мой вопрос – Driver

+3

Соберите все из них в массиве, используйте функцию ['sort()'] (http://php.net/manual/en/ function.sort.php), выберите первый. – axiac

ответ

0

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

$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

вам действительно нужно получить эти имена каталогов рекурсивно – Ghost

+0

Я не видел, чтобы это упоминалось в вопросе. Я понял это как плоскую структуру каталогов. Если это так, то он может использовать 'RecursiveDirectoryIterator' – Robert

+0

уверен, что OP может пойти по этому маршруту, скорее всего, OP запросит эту часть, так как она просто попросит весь код, я желаю вам удачи тогда :) – Ghost

0

Немного как стиль Pascal)

<?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; 
    } 

?>