PHP:使用-1和-10等值对数组进行排序-

PHP:使用-1和-10等值对数组进行排序-,php,arrays,Php,Arrays,我有一个函数,它从目录中获取文件名,然后将它们放入数组中。所有文件名都以代码开头,例如:-0-filename.php、-1-filename.php、-2-filename.php和-10-filename.php 经过一些步骤后,文件名将被回显。过程如下所示: rsort( $archiveArray ); $amount = count( $archiveArray ); $i = 0; while( $i <= $amount ) { echo $archiveArray[

我有一个函数,它从目录中获取文件名,然后将它们放入数组中。所有文件名都以代码开头,例如:-0-filename.php、-1-filename.php、-2-filename.php和-10-filename.php

经过一些步骤后,文件名将被回显。过程如下所示:

rsort( $archiveArray );
$amount = count( $archiveArray );
$i = 0;
while( $i <= $amount )
{
    echo $archiveArray[$i];
    $i++;
}
$names =  // your array of file names.
$sorted = // the sorted version names.

for($i = 0; $i < count($arr); $i++) {
  $sorted[substr($names[$i], 1, strpos($names[$i], '-', 2))] = $names[$i];
}

print_r($sorted);
rsort($archiveArray);
$amount=计数($archiveArray);
$i=0;

而($i
rsort
有一个可选的第二个参数,名为
sort\u flags
。使用
sort\u NATURAL
进行“自然排序”


rsort
有一个可选的第二个参数,名为
sort\u flags
。使用
sort\u NATURAL
进行“自然排序”


您需要将数字转换为
int
值。现在它被解释为
字符串
。您可以这样做:

rsort( $archiveArray );
$amount = count( $archiveArray );
$i = 0;
while( $i <= $amount )
{
    echo $archiveArray[$i];
    $i++;
}
$names =  // your array of file names.
$sorted = // the sorted version names.

for($i = 0; $i < count($arr); $i++) {
  $sorted[substr($names[$i], 1, strpos($names[$i], '-', 2))] = $names[$i];
}

print_r($sorted);
$names=//文件名数组。
$sorted=//已排序的版本名。
对于($i=0;$i

基本上,您从
$names
中获取名称,根据两个
-
之间的数字在排序数组中给它一个索引,然后将其添加到
$sorted
中。您需要将数字转换为
int
值。现在它被解释为
字符串。您可以这样做:

>
rsort( $archiveArray );
$amount = count( $archiveArray );
$i = 0;
while( $i <= $amount )
{
    echo $archiveArray[$i];
    $i++;
}
$names =  // your array of file names.
$sorted = // the sorted version names.

for($i = 0; $i < count($arr); $i++) {
  $sorted[substr($names[$i], 1, strpos($names[$i], '-', 2))] = $names[$i];
}

print_r($sorted);
$names=//文件名数组。
$sorted=//已排序的版本名。
对于($i=0;$i

基本上,您可以从
$names
中获取名称,根据两个
-
之间的数字在排序数组中给它一个索引,然后使用
rsort
SORT\u NATURAL
将其添加到
$sorted

,如果您运行的是PHP5.4,则可以使用
rsort

natsort( $archiveArray );
$archiveArray = array_reverse( $archiveArray );
…将执行相同的操作。只需使用
natsort
执行自然顺序排序,然后反转数组

测试代码(PHP5.3.3):


如果您正在运行PHP5.4,则将
rsort
SORT\u NATURAL
结合使用会起作用。但是,如果您没有运行PHP5.4,则:

natsort( $archiveArray );
$archiveArray = array_reverse( $archiveArray );
…将执行相同的操作。只需使用
natsort
执行自然顺序排序,然后反转数组

测试代码(PHP5.3.3):

另一种方法是,编写自己的排序标准

我使用正则表达式解析字符串中的数值,如下所示:

$files = array(
    '-0-filename.php',
    '-1-filename.php',
    '-2-filename.php',
    '-3-filename.php',
    '-4-filename.php',
    '-5-filename.php',
    '-6-filename.php',
    '-7-filename.php',
    '-8-filename.php',
    '-9-filename.php',
    '-10-filename.php',
    '-11-filename.php',
    );

usort($files, 'CustomFileSequence');

var_dump($files);

function CustomFileSequence($a, $b)
{
    $pattern = '/^\\-([0-9]*)\\-/';
    preg_match($pattern, $a, $matches);
    $a_val = $matches[1];
    preg_match($pattern, $b, $matches);
    $b_val = $matches[1];

    if ($a_val < $b_val)
        return 1;
    if ($a_val > $b_val)
        return -1;
    if ($a_val == $b_val)
        return 0;
}
另一种方法是,编写自己的排序标准

我使用正则表达式解析字符串中的数值,如下所示:

$files = array(
    '-0-filename.php',
    '-1-filename.php',
    '-2-filename.php',
    '-3-filename.php',
    '-4-filename.php',
    '-5-filename.php',
    '-6-filename.php',
    '-7-filename.php',
    '-8-filename.php',
    '-9-filename.php',
    '-10-filename.php',
    '-11-filename.php',
    );

usort($files, 'CustomFileSequence');

var_dump($files);

function CustomFileSequence($a, $b)
{
    $pattern = '/^\\-([0-9]*)\\-/';
    preg_match($pattern, $a, $matches);
    $a_val = $matches[1];
    preg_match($pattern, $b, $matches);
    $b_val = $matches[1];

    if ($a_val < $b_val)
        return 1;
    if ($a_val > $b_val)
        return -1;
    if ($a_val == $b_val)
        return 0;
}
我曾经这样做过:-

$files = array('-10-filename.php', '-9-filename.php', '-8-filename.php', '-10-filename.php', '-1-filename.php', '-0-filename.php');
    $cmp = function($a, $b){
        list($mt, $num1, $name) = explode('-', $a);
        list($mt, $num2, $name) = explode('-', $b);
        return $num1 - $num2;
    };
    usort($files, $cmp);
    var_dump($files);
给我这个输出:-

array
  0 => string '-0-filename.php' (length=15)
  1 => string '-1-filename.php' (length=15)
  2 => string '-8-filename.php' (length=15)
  3 => string '-9-filename.php' (length=15)
  4 => string '-10-filename.php' (length=16)
  5 => string '-10-filename.php' (length=16)
如果要将它们反向排序,只需将比较函数中的最后一行更改为:-

return $num2 - $num1;
顺便说一句,你可能会发现这很有用。

我过去经常这样做:-

$files = array('-10-filename.php', '-9-filename.php', '-8-filename.php', '-10-filename.php', '-1-filename.php', '-0-filename.php');
    $cmp = function($a, $b){
        list($mt, $num1, $name) = explode('-', $a);
        list($mt, $num2, $name) = explode('-', $b);
        return $num1 - $num2;
    };
    usort($files, $cmp);
    var_dump($files);
给我这个输出:-

array
  0 => string '-0-filename.php' (length=15)
  1 => string '-1-filename.php' (length=15)
  2 => string '-8-filename.php' (length=15)
  3 => string '-9-filename.php' (length=15)
  4 => string '-10-filename.php' (length=16)
  5 => string '-10-filename.php' (length=16)
如果要将它们反向排序,只需将比较函数中的最后一行更改为:-

return $num2 - $num1;


另一方面,您可能会发现它很有用。

您可以控制文件名吗?前导零会很有用。您的排序是使用
usort
函数以错误的方式进行基数排序:您可以控制文件名吗?前导零会很有用。您的排序是使用
usort函数:这不是做同样的事情吗?问题是它们被排序为字符串…更改了它,但什么都没有发生。编辑了答案。我不认为SORT_字符串是正确的。SORT_NATURAL是您想要的。它从PHP5.4开始就可用。SORT_NATURAL给我一个错误:“rsort()异常参数2太长,字符串在…”。这不会做同样的事情吗?问题是它们被排序为字符串…更改了它,但什么都没有发生。编辑了答案。我认为SORT_字符串是不对的。SORT_NATURAL是您想要的。它从PHP 5.4开始就可用。SORT_NATURAL给我一个错误:“rsort()EXPECTS参数2很长,字符串以…”。假设每个数字都是唯一的,这就行了,但是如果文件名的其他部分都是不同的,而每个数字都是唯一的,这就行了,但是如果文件名的其他部分都是不同的,那么每个数字都是唯一的,这就行了。如果这么简单,那就太棒了,但是如果我只使用你的代码片段,它会输出这些文件以非常随机的顺序排列,比如-0-、-7-、-4-、-1-、-8-、-2-…随机顺序?这很奇怪…您使用的是什么版本的PHP?我已经用我用来测试这个的代码更新了我的答案。您正在运行
数组\u reverse
部分,对吗?
natsort
保留键值关系,所以如果您使用
while
在您的问题中循环,则值将不会以正确的顺序打印(请参阅我的示例中的第一个
打印\r
).
array\u reverse
在反转数组时将键固定为正确的值。如果您有shell访问权限,
php-v
将告诉您。否则您可以创建一个phpinfo.php文件:
请确保在检查信息后删除phpinfo.php;不希望其他人找到它!:)抱歉,你编辑了你的评论而不是发布了另一条,所以我没有收到通知。我上面的
打印\r
是为了演示;您不想使用它来输出文件。我会使用一个
foreach
循环:
foreach($archiveArray作为$file){echo$file;}
如果它这么简单的话那就太棒了,但是如果我只使用你的代码片段,它会以非常随机的顺序输出文件,比如-0-,-7-,-4-,-1-,-8-,-2-…随机顺序?真奇怪。。。您使用的是什么版本的PHP?我已经用我用来测试这个的代码更新了我的答案。您正在运行
array\u reverse
部分,对吗
natsort
保持键值关系不变,因此如果