新闻系统的数组排序问题

时间:2010-12-28 05:36:13

标签: php arrays sorting

我目前正试图找出如何对数组文件进行排序。我有一个简单的新闻发布系统,将内容存储在单独的 .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

3 个答案:

答案 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()。但两者都维持指数关联。