Создать вложенный список из имен файлов - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть каталог, полный файлов с соглашением об именах yyyymm.xml. Мне нужно создать такой список:

<ul>
 <li>2010
  <ul>
   <li>Dec</li>
   <li>Nov</li>
   ...
   <li>Feb</li>
   <li>Jan</li>
  </ul>
 </li>
 <li>2009
  <ul>
   <li>Dec</li>
    ...etc.
  </ul>
 </li>
</ul>

Моя последняя попытка:

<?php
$tempYear = 0;
date_default_timezone_set('Australia/Melbourne');
if ($handle = opendir('news')) {
   // Open the news dir
    echo "<p>News archive</p>";
    echo "<ul>";
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $fileDate = basename($file, ".xml");
            $fileDate = $fileDate . "01";
            // Strip the .xml extention from the filename
            $currYear = date("Y", strtotime($fileDate));
            $currMonth = date("F");
            $archMonth = date("F", strtotime($fileDate));
            //echo "<li>$archMonth</li>";
            if ($currYear != $tempYear){
                echo "<li>$currYear";
                $tempYear = $currYear;
            }else{
                echo "<ul>";
                while ($currMonth != $archMonth){
                    echo "<li>$archMonth</li>";
                }
                echo "</ul>";
                echo "</li>";
            }
        }
    }
    echo "</ul>";
    closedir($handle);
}                   
?>

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Вы можете использовать что-то вроде этого, чтобы разделить имена файлов:

$list = array();

foreach ($files as $filename) {
    $year = intval(substr($filename, 0, 4));
    $month = intval(substr($filename, 3, 2));

    if (!is_array($list[$year])) {
        $list[$year] = array();
    }

    $list[$year][] = $month;
}

Затем вы можете перечислить их так, как вам нужно:

if (!empty($list)) {
    echo '<ul>';

    foreach ($list as $year => $months) {
        echo '<li>'.$year;

        if (!empty($months)) {
            echo '<ul>';

            foreach ($months as $month) {
                // you can add some magic here to display
                // the month as text instead of a number.
                echo '<li>'.$month.'</li>';
            }

            echo '</ul>';
        }

        echo '</li>';
    }

    echo '</ul>';
}
0 голосов
/ 06 декабря 2010
<?php
$dir = '.';

/**
 * find the files and store them in array
 **/
if(is_dir($dir)) {
  if($dh = opendir($dir)) {
    $menutree = array();

    while(($file = readdir($dh)) !== false) {
      // check if filename is correct
      if(strlen($file) == 10 && strtolower(substr($file, -3)) == 'xml') {
        $menuTree[substr($file, 0, 4)][substr($file, 4, 2)] = $file;
      }
    }

    closedir($dh);
  }
}

/**
 * build the tree
 **/
if(is_array($menuTree) && count($menuTree) > 0) {
  // sort
  asort($menuTree);

  foreach($menuTree as $year => $months) {
    ksort($menuTree[$year]);
  }

  // define months
  $monthsWords = array(
    'Jan',
    'Feb',
    'Mar',
    'Apr',
    'May',
    'Jun',
    'Jul',
    'Sep',
    'Oct',
    'Nov',
    'Dec'
  );

  // echo html
  echo('<ul>' . "\n");

  foreach($menuTree as $year => $months) {
    echo("\t" . '<li>' . $year . "\n");
    echo("\t\t" . '<ul>' . "\n");

    foreach($months as $month => $filename) {
      echo("\t\t\t" . '<li>' . $monthsWords[(int) $month - 1] . '</li>' . "\n");
    }

    echo("\t\t" . '</ul>' . "\n");
    echo("\t" . '</li>'); 
  }

  echo('</ul>' . "\n");
}
?>

Быстро и грязно ... ;-).Есть много вещей, которые нужно улучшить ...
На основании этого вы сможете построить то, что вам нужно.

0 голосов
/ 06 декабря 2010

За какую часть вы боролись?

По сути, вы хотите получить список файлов, циклически перебирать их и анализировать их по годам и месяцам, а затем заполнять ихв массиве что-то вроде этого:

$array[year][] = month;

Таким образом, у вас есть массив, который содержит список лет, каждый из которых содержит массив месяцев.Затем просмотрите эту структуру данных, чтобы вывести свой HTML.

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

Редактировать: Цикл вышеупомянутой структуры

По сути, у вас есть массив массивов, если вы делаете, как я намекалвышеСтруктура вашего массива будет выглядеть следующим образом:

$array['2010'] = array('jan','mar','sep');
$array['2009'] = array('feb','sep','oct');

Для циклического перемещения по этому массиву

foreach($array as $key => $months) {
    echo "year: $key\n";
    foreach($months as $month) {
         echo "$month\n";
    }
}

Что приведет к выводу:

2010
jan
mar
sep
2009
feb
sep
oct

При необходимости добавьте HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...