如何通过每个字符串的尾随整数对平面数组进行稳定排序

问题描述 投票:0回答:5
$array = array(
   'list1 - 1',
   'list7 - 1',
   'list5 - 2',
   'list3 - 1'
);

我需要对该数组进行数字排序。该函数应该检查等号后面的值进行排序。


结果:
list1 - 1
list7 - 1
list3 - 1
list5 - 2

在上面的结果中,顺序无论是按字母顺序还是按数字顺序都没有改变,直到“list[5]”为止。我该怎么做?
php arrays sorting stable-sort
5个回答
4
投票

创建自定义排序并通过

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


3
投票

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

$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"
}

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');

0
投票

PHP 确保从 PHP8 开始稳定排序,因此在

explode()
内部使用
usort()
调用将允许隔离尾随数字,并且 spaceship 运算符会将数字评估为整数值。 演示

usort(
    $array,
    fn($a, $b) => explode(' - ', $a)[1]
                  <=>
                  explode(' - ', $b)[1]
);
var_export($array);

-1
投票
function mySort($array) {
    foreach ($array as $key => $value)  {  
        $array[$key] = explode(" - ", $array[$key]);
        $data[$value] = $array[$key][1];
    }
    asort($data);
}
© www.soinside.com 2019 - 2024. All rights reserved.