自定义排序数组

时间:2011-02-20 16:02:35

标签: php arrays sorting

$array = array(
   'list1 - 1',
   'list7 - 1',
   'list5 - 2',
   'list3 - 1'
);

我需要用数字排序这个数组。该函数应检查等号后的值以进行排序。


结果:

list1 - 1
list7 - 1
list3 - 1
list5 - 2


在上面的结果中,在list[5]之前,顺序不会按字母顺序或数字顺序更改。我该怎么做?

4 个答案:

答案 0 :(得分:3)

创建自定义排序并通过usort函数

执行
function mysort($a,$b)
{
    $a = substr($a,-1,1);
    $b = substr($b,-1,1);

    if ($a == $b)
    {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

然后将其传递给使用您的数组的usort:

 usort($myarray, "myarray");

-

您要求很难完成,因为您想要对没有逻辑标识符的数组进行排序,我们的思想会尽可能地解释您的结果但不创建矩阵,难以实现的硬编码概念,您最好的选择如果该类总是与上面完全相同,那么手动执行此操作:

$temp = $array[3];
$array[3] = $array[4];
$array[4] = $temp;

参考:http://www.php.net/manual/en/function.usort.php

答案 1 :(得分:2)

看起来您想首先搜索尾随数字,但如果它们相同则您希望保留项目的原始顺序。这意味着需要更多的思考,但实质上,这项工作仍然非常简单。

$array = array(
   'list1 - 1',
   'list7 - 1',
   'list5 - 2',
   'list3 - 1',
);

function sort_list(&$subject) {
    // Get an array of the trailing numbers to use within the callback
    $nums = preg_replace('/^.* - (\d+)$/', '$1', $subject);
    // Sort values by trailing number or key
    uksort($subject, function($a,$b) use ($nums) {
        // If numbers are the same, sort by key
        if ($nums[$a] === $nums[$b]) {
            return $a - $b;
        }
        // Othwerise sort by numbers
        return $nums[$a] - $nums[$b];
    });
}

sort_list($array);
var_dump($array);

输出类似:

array(4) {
  [0]=>
  string(9) "list1 - 1"
  [1]=>
  string(9) "list7 - 1"
  [3]=>
  string(9) "list3 - 1"
  [2]=>
  string(9) "list5 - 2"
}

答案 2 :(得分:1)

其中$array是数组的名称。如果数字大于1位,则此功能有效。

function custom_sort($a, $b)
{
   $exp = '/(\d+)$/';
   preg_match($exp, $a, $a);
   preg_match($exp, $b, $b);
   return intval($a[1]) - intval($b[1]);
}

usort($array, 'custom_sort');

答案 3 :(得分:-1)

function mySort($array) {
    foreach ($array as $key => $value)  {  
        $array[$key] = explode(" - ", $array[$key]);
        $data[$value] = $array[$key][1];
    }
    asort($data);
}