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"]."&f=$f' title='Delete $f'>Delete</a></span>
</div>";
}
答案 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
尝试filemtimefunction 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');