如何通过它吐出的文件名组织PHP foreach循环?

时间:2011-08-03 10:30:48

标签: php foreach

Alreet All

我正在尝试组织一个foreach循环返回的文件列表 - 文件标有一个月:例如报告 - 2011年1月,报告 - 2011年2月等

他们目前以随机顺序吐出它们,例如7月,2月,12月,3月,我希望它们按顺序出现,如1月,2月,3月,4月等。

你们能否阐明我将如何做到这一点。

这是我的功能:

function getDirectoryList($directory) {
$results = array();
$handler = opendir($directory);
while ($file = readdir($handler)) {
    if ($file != "." && $file != ".." && $file != "img") {
        $results[] = $file;
    }
}
closedir($handler);
return $results;
}

这是对函数的调用:(注意“filepath”是使用define())

设置的
$files = getDirectoryList(filepath.$username."/".date("Y"));

这是foreach循环:

foreach ($files as $f) {    
$path_parts = pathinfo(filepath.$f);
$dir = $path_parts['dirname'];
$base = $path_parts['basename'];
$ext = $path_parts['extension'];
$fname = $path_parts['filename'];

echo "<div class='file ".$ext."'>".
    "<a href='".downloadpath.$username."/".$f."' target='_blank' title='Download $f'>". $fname ."</a>
    <span class='del'><a href='../inc/delete.php?id=".$_GET["id"]."&amp;f=$f' title='Delete $f'>Delete</a></span>
    </div>";
}

5 个答案:

答案 0 :(得分:5)

在循环之前对数组进行排序

function cmp($a, $b) {
  $a = pathinfo(filepath.$a);
  $b = pathinfo(filepath.$b);
  $months = array(1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December');

  $a_val = $b_val = 0;
  foreach ($months as $value => $month) {
    if (stripos($a['filename'], $month) !== false) $a_val = $value;
    if (stripos($b['filename'], $month) !== false) $b_val = $value;
  }
  return ($a_val < $b_val) ? -1 : 1;
}

uasort($files, 'cmp');

答案 1 :(得分:1)

使用usort对数组进行排序。

usort($files, 'cmp');

使用关联数组设置比较标准:

$months = array ("january" => 0, "february" => 1, ...);

设置比较功能:

function cmp($file1, $file2) {
    $months = array ("january" => 0, "february" => 1, ...);
    // or global $months;
    // or $this->months;
    $month1 = ... extract month from $file1;
    $month2 = ... extract month from $file2;
    return $months[$month1] < $months[$month2] ? -1 : 1;
}

从文件中提取月份字符串:

preg_match("/^\w+/", $file, $match);
$month = $match[0];

编辑:

数组$ months不需要存储在cmp方法中。这将导致每次调用方法时都会创建数组。请改为使用OOP方法或全局关键字global $months

答案 2 :(得分:0)

使用ksort

尝试filemtime
function getDirectoryList($directory) {
$results = array();
    $handler = opendir($directory);
    while ($file = readdir($handler)) {
        if ($file != "." && $file != ".." && $file != "img") {
            $inDate = filemtime($directory.$file);
            $results[$inDate] = $file;
        }
    }
    closedir($handler);
    ksort($results);
    return $results;
}

答案 3 :(得分:0)

function getSortableDate( $s ) {
    $months = array( 'january' => '01', 'february' => '02', 'march' => '03', ... );
    preg_match( '/^(\w+) (\d+)$/', $s, $matches );
    return $matches[2].$months[ $matches[1] ];
}

function cmp($a, $b) {
    return ( getSortableDate( $a['filename'] ) < getSortableDate( $b['filename'] ) ) ? -1 : 1;
}

uasort( $files, 'cmp' );

或者,您可以在排序之前将getSortableDate()应用于所有文件名,然后使用简单的字符串比较进行排序,这样可以通过防止冗余的getSortableDate()调用来加快速度。

但我不会亲自这样做,这是一种矫枉过正,只需将您的文件重命名为2011-01 2011-02等。所以可以将它们作为字符串进行比较。

答案 4 :(得分:0)

使用自定义函数在$ files数组上使用usort。

function my_sort($a,$b) {
     $month = array (
        'january' => 1,
        'february' => 2,
        'march' => 3,
        'april' => 4,
        'may' => 5,
        'june' => 6,
        'july' => 7,
        'august' => 8,
        'september' => 9,
        'october' => 10,
        'november' => 11,
        'december' => 12
    );

    // Might need to extract month from filename here
    $a_idx = $month[$a['filename']];
    $b_idx = $month[$b['filename']];

    if ($a_idx == $b_idx) {
        return 0;
    }
    else {
        return ($a_idx < $b_idx ? -1 : 1);
    }
}

usort($files,'my_sort');