如何按两个条件对数组进行排序?

时间:2015-09-16 18:20:01

标签: php arrays sorting

我有一个数组,我希望回显按字母顺序排列,同时忽略启动每个字符串的数字,如下:

0 Apple
1 Apple
3 Apple
0 Banana
1 Banana
0 Carrot
//...

排序时,数字先排序。所以,我尝试了asort,sort_string没有成功。

$file = file("grades.txt");
asort($file, SORT_STRING);

我可以只查看字母字符并忽略数字吗?或者我可以忽略第一个字符并从第二个字符开始排序吗?我该怎么做才能得到上述结果?

如果在按字母顺序回显数组之后数字可以按顺序排列会很棒,但是如果太难做就不需要它。

4 个答案:

答案 0 :(得分:1)

也许尝试php的uasort功能。 http://php.net/manual/en/function.uasort.php

function cmp($a, $b) {
    if ($a[2] == $b[2]) {
        return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
}
uasort($array, 'cmp');

答案 1 :(得分:1)

您可以交换字母部分和数字部分的位置,并使用strcmp()比较usort()中的字符串。

http://php.net/manual/en/function.usort.php

usort($arr, function($a, $b) {
    $a = $a[2].' '.$a[0];
    $b = $b[2].' '.$b[0];
    return strcmp($a, $b);
});

答案 2 :(得分:0)

为此,您需要一个自定义订单功能,您可以使用uasort(),例如

简单explode()你的字符串用空格,并将数字和字符串保存在变量中。然后,如果字符串是相同的顺序,则按数字排序。否则按字符串排序。

uasort($arr, function($a, $b){
    list($numberA, $stringA) = explode(" ", $a);
    list($numberB, $stringB) = explode(" ", $b);

    if(strnatcmp($stringA, $stringB) == 0)
        return $numberA < $numberB ? -1 : 1;
    return strnatcmp($stringA, $stringB);    

});

答案 3 :(得分:0)

您可以使用preg_replace()从字符串开头删除数字,preg_replace()接受第三个参数(subject)作为数组(对每个项目执行搜索和替换)。< / p>

$file = preg_replace( '/^[\d\s]+/', '', file("grades.txt") );

arsort( $file );

编辑:

使用preg_replace( '/^([\d\s]+)(.+)/', '$2 $1', file("grades.txt") )将数字移到字符串的末尾。