PHP - 在原始排序后对数据进行排序

时间:2013-07-07 04:17:17

标签: php sorting foreach

我正在显示目录列表。我正在尝试按文件名排序文件,但也按其扩展名排序。

显示之前......
- 首先按文件名排序
- 然后在此类别中按扩展名排序

例如:
  a_first.jpg
  a_first.png
  a_first.zip
  b_second.doc
  b_second.gif
  b_second.jpg

<?php 
function getFileExt($filename) {
    return substr(strrchr($filename,'.'),1);
}

$handle=opendir(dirname(__FILE__));

while (($file = readdir($handle))!==false) {
    $fileExt = strtolower(getFileExt($file));
    if(in_array($file, $ignore_file_list)) { continue; }
    if(in_array($fileExt, $ignore_ext_list)) { continue; }
    if(is_dir($file)) { $fileExt = "dir"; }

/*
HERE:

Before display...
  -  sort by filename first
  -  then sort by extension within this sort

Example:
  a_first.jpg
  a_first.png
  a_first.zip
  b_second.doc
  b_second.gif
  b_second.jpg
*/

    echo '
<div><a href='.$file.' class='.$fileExt.'>&nbsp;</a></div>
<div><a href='.$file.'>$file</a></div>
';
}

closedir($handle);
?>

我不确定是否需要使用FOREACH在WHILE中进行第二次排序(=文件扩展名),或者在WHILE之外执行FOREACH(将数据首先放入数组)或者这是多阵列排序情况或...... ???

仅供参考:使用数据库不是一种选择。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你可以使用glob和natcasesort。

$files = glob($directory."/*.*");
// for just the files names 
$files = array_map("basename", $files);
natcasesort($files);

如果您想将结果限制为具有特定扩展名的项目,您可以将glob调用更改为

$files = glob($directory."/*.{jpg,png,zip}", GLOB_BRACE);

答案 1 :(得分:0)

foreach ($example as $value) {
  $file[] = $value;
//regex would be better incase you have files with more than one period
  list($ext, $nam) = explode('.'$value);
  $extention[] = $ext;
  $name[] = $nam;
}

a_sort($extention);
a_sort($name);


foreach($extention as $key=>$value){
  echo $file[$key]."<br/>";
}

foreach($name as $key=>$value){
  echo $file[$key]."<br/>";
}