按多个规则对平面数组进行排序

Sort flat array by multiple rules

我需要一些关于我的数组排序函数的帮助,因为它没有按我预期的那样工作。

此函数是将数组[0,1,2,3,4,...23]排序为数组[9,10,11,12,...,23,0,1,2 ,3,4,5,6,7,8],我正计划集成此功能以对矩阵中的数据进行排序 table。

我不明白为什么值 [0,1,2] 不合适。

代码如下:

<?php
function cmp($a, $b)
{
    if ($a == $b) return 0;
    if ($a == 9) return -1;
    if ($b == 9) return 1;
    return strcmp($a, $b);
}
$a = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
echo'<br>';
usort($a, "cmp");

//print_r($a);
echo '<pre>';
    print_r($a);
echo '</pre>';

$arrlength=count($a);
for($x=0;$x<$arrlength;$x++)
{
    echo $a[$x];
    echo "<br>";
}
?>

您似乎想按位数反向排序整数,然后在每个数字计数组中按顺序排序。此外,还有一个特殊限制,即 9 算作 double-digit 个数字。

此函数生成预期的输出,但可能需要修改以处理测试用例中不明显的条件,例如数字 90 及以上(但从评论来看,这与时间有关,因此可能就足够了):

function cmp($a, $b) {

  // Handle nines
  if ($a == 9) { return -1; }
  if ($b == 9) { return 1;  }

  // Perform a comparison by digit count
  $cmp = strcmp(strlen($a), strlen($b));

  if ($cmp === 0) { // Same digit count, sort sequentially
    return $a - $b; 
  }

  return -$cmp; // Different digit counts; sort in reverse
}

根据需要使用 3 向比较,并在出现平局时回退到下一个排序标准。

  1. 按“if 9”排序(ASC 排序时falsetrue 之前)
  2. 然后按字符串长度DESC排序
  3. 然后按值ASC排序

代码:(Demo)

usort(
    $array,
    fn($a, $b) =>
        ($a !== 9) <=> ($b !== 9)
        ?: strlen($b) <=> strlen($a)
        ?: $a <=> $b
 );

var_export($array);