Php 新闻系统中的数组排序问题

Php 新闻系统中的数组排序问题,php,arrays,sorting,Php,Arrays,Sorting,目前,我一直在想如何对数组文件进行排序。我有一个简单的新闻发布系统,它将内容存储在单独的.dat文件中,然后将它们存储在一个数组中。我对文件进行了编号,这样我的数组就可以将它们从最低数量排序到最高数量;然而,我遇到了一个小问题。首先是关于我的系统的更多信息,以便您更好地理解它 收集我的文件的功能是: function getNewsList() { $fileList = array(); // Open the actual directory

目前,我一直在想如何对数组文件进行排序。我有一个简单的新闻发布系统,它将内容存储在单独的.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}";
在上述功能上运行打印时,我得到:

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

将文件名提取为整数:

// $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;
}
最后使用:


修复:ksort()=>krsort()

获取文件名并将前缀数字提取为整数:

// $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;
}
最后使用:

修复:ksort()=>krsort()

您可以使用php的natcasesort(array)函数,该函数将使用“自然顺序”算法对数组进行排序,您将获得所需的输出

:Malay

您可以使用php的natcasesort(array)函数,该函数将使用“自然顺序”算法对数组进行排序,您将获得所需的输出


:马来语

问题在于下划线。始终将数字字符排序在下划线之前

查看是否使用
排序($your\u array,sort\u NUMERIC)
获得所需结果

有关更多信息,请参阅


您也可以使用
natcasesort()
(根据马来语的建议)或
natsort()
。但两者都保持索引关联。

问题在于下划线。始终将数字字符排序在下划线之前

查看是否使用
排序($your\u array,sort\u NUMERIC)
获得所需结果

有关更多信息,请参阅



您也可以使用
natcasesort()
(根据马来语的建议)或
natsort()
。但两者都保持索引关联。

在创建$fileList[]数组的第一个函数之后,如果您这样做,它会是什么样子呢。。。回声“;打印(文件列表);回声“;这将显示它设置数组的顺序。您可能需要将其转换为一个新数组,并设置一些排序例程,以使其符合您要查找的顺序。我希望注释部分为换行符。。。。我试着让它更具可读性,但结果是这样的:数组([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_asassa.dat[7]=>003_SSASAS.dat…[13]>009 dafon damu asada.dadadadadadadadadadadadadadadad]我明白你的意思吗,您想构建一个包含文件名及其创建/修改时间的数组,并按时间戳对其进行排序吗?我明白您的意思了。这就是它在页面上的显示方式。。。所以它在“001”之前读“0010”。。错误不在于分页,而在于如何使用第一个函数将其排序到数组中?@lemonpole:我的意思是,这里真正的问题是什么?在创建$fileList[]数组的第一个函数之后,如果您这样做,它会是什么样子。。。回声“;打印(文件列表);回声“;这将显示它设置数组的顺序。您可能需要将其转换为一个新数组,并设置一些排序例程,以使其符合您要查找的顺序。我希望注释部分为换行符。。。。我试着让它更具可读性,但结果是这样的:数组([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_asassa.dat[7]=>003_SSASAS.dat…[13]>009 dafon damu asada.dadadadadadadadadadadadadadadad]我明白你的意思吗,您想构建一个包含文件名及其创建/修改时间的数组,并按时间戳对其进行排序吗?我明白您的意思了。这就是它在页面上的显示方式。。。所以它在“001”之前读“0010”。。错误不在于分页,而在于如何使用第一个函数将其排序到数组中?@lemonpole:我的意思是,这里真正的问题是什么?谢谢您的输入。我相信我在下划线前有数字字符。我尝试过使用sort()、natcasesort()和natsort(),但它仍然在001之前对0010进行排序。。我目前正在尝试marcel的方法,可能会尝试用ASCII值小于字符0(即48)的任何字符替换
。谢谢您的输入。我相信我在下划线前有数字字符。我尝试过使用sort()、natcasesort()和natsort(),但它仍然在001之前对0010进行排序。。我目前正在尝试marcel的方法,这可能会起作用,尝试用ASCII值小于字符0(即48)的任何字符替换
。。是的,谢谢!你的方法正是我想要的。我确实做了一些修改,将ksort()改为krsort,以便从最新到最旧进行排序:)非常感谢,没错,您想按降序排序。。。对不起,我弄错了;-)索尔