我目前正试图找出如何对数组文件进行排序。我有一个简单的新闻发布系统,将内容存储在单独的 .dat 文件中,然后将它们存储在一个数组中。我对文件进行编号,以便我的数组可以将它们从最小数量到最大数量排序;但是,我遇到了一个小问题。从这里开始是关于我的系统的更多信息,以便您可以更好地理解它。
收集我的文件的功能是:
function getNewsList() {
$fileList = array();
// Open the actual directory
if($handle = opendir(ABSPATH . ADMIN . "data")) {
// Read all file from the actual directory
while($file = readdir($handle)) {
if(!is_dir($file)) {
$fileList[] = $file;
}
}
}
// Return the array.
return $fileList;
}
在单独的文件上是处理新闻帖子的编程。为简单起见,我没有发布该代码,但我将解释如何命名文件。文件是编号的,并使用帖子标题的一部分......对于编号我得到数组的计数并添加“1”作为偏移量。我得到帖子的标题,编码使其文件名友好并限制文本的数量,所以我最终得到的结果:
// Make the variable that names the file that will contain
// the post.
$filename = "00{$newnumrows}_{$snipEncode}";
在上述功能上运行 print_r 时,我得到:
Array (
[0] => 0010_Mira_mi_Soledad.dat
[1] => 0011_WOah.dat
[2] => 0012_Sinep.dat
[3] => 0013_Living_in_Warfa.dat
[4] => 0014_Hello.dat
[5] => 001_AS.dat
[6] => 002_ASASA.dat
[7] => 003_SSASAS.dat
...
[13] => 009_ASADADASADAFDAF.dat
)
这就是我的内容的显示方式。出于某种原因,根据数组排序 0010 出现在 001 之前...?有没有办法让我的数组在 0010 之前排序 001 ?
答案 0 :(得分:2)
您可以使用php的natcasesort(array)函数,它将使用“自然顺序”算法对数组进行排序,您将获得所需的输出
HTH。
:马来
答案 1 :(得分:1)
取文件名并将前缀号提取为整数:
// $filename has the format: "00{$newnumrows}_{$snipEncode}"
function generateSortKey($filename)
{
$separatorPos = stripos($filename, '_');
$prefix = trim(substr($filename, 0, $separatorPos));
return intval($prefix);
}
比从文件列表创建关联数组,这些键稍后将用作可排序值:
function toSortableArray($files)
{
$result = array();
foreach ($files as $filename)
{
$key = generateSortKey($filename);
$value = $filename;
$result[$key] = $value;
}
return $result;
}
并最后使用krsort():
$list = getNewsList();
$sortableList = toSortableArray($list);
krsort($sortableList); // after that $sortableList is
// sorted by key in descending order now
FIX:ksort()=> krsort()
答案 2 :(得分:1)
问题在于下划线。总是数字字符在下划线之前排序。
查看您是否使用sort($your_array, SORT_NUMERIC)
获得了所需的结果。
有关详细信息,请参阅PHP Manual for sort
您也可以使用natcasesort()
(如马来建议的那样)或natsort()
。但两者都维持指数关联。